1. 程式人生 > 實用技巧 >SpringBoot——日誌及原理

SpringBoot——日誌及原理

一、實驗目的

1. 理解和掌握將資料、程式碼、棧放入不同邏輯段的程式的編寫和除錯
2. 理解具有多個段的彙編源程式對應的目標程式執行時,記憶體分配方式
3. 掌握大小寫字元的轉換方法、數字字元和數值之間的轉換方法
4. 理解並掌握各種定址方式的靈活應用
5. 掌握彙編指令loop, and, or,div, mul的用法

二、實驗準備

複習教材chapter 6-8章。

三、實驗內容

1.實驗任務1


assume cs:code, ds:data
data segment
        db 'Nuist'
        db 5 dup(2)
data ends

code segment
start:
        mov ax, data
        mov ds, ax

        mov ax, 0b800H
        mov es, ax

        mov cx, 5
        mov si, 0
        mov di, 0f00h
s:      mov al, [si]
        and al, 0dfh
        mov es:[di], al
        mov al, [5+si]
        mov es:[di+1], al
        inc si
        add di, 2
        loop s

        mov ah, 4ch
        int 21h
code ends
end start

使用masm、link對task1.asm進行彙編、連結,得到可執行檔案task1.exe,執行並觀察結果。

使用debug工具對程式進行除錯,執行到程式返回前,即line27之前,觀察結果。

修改line4裡5個位元組單元的值,重新彙編、連結、執行,觀察結果。

基於觀察,分析、猜測這裡的數值作用是什麼?

這裡的數值作用是更改字元的顏色。

2.實驗任務2

assume cs:code,ds:data
data segment
    db 23,50,66,71,35
data ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov di,
0 mov cx,5 s: mov ah,0 mov al,ds:[di] mov bl,10 div bl mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h mov ah,2 mov dl," " int 21h inc di loop s mov ax,4c00h
int 21h code ends end start

3.實驗任務3

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends

stack segment
  dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

反彙編檢視data段中資料及反彙編除錯的截圖

①data段中的資料為:0123H 0456H 0789H 0ABCH 0DEFH 0FEDH 0CBAH 0987H

②cs=cs=076CH,ss=076BH,ds=076AH

③設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1

4.實驗任務4

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0, 0
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

反彙編除錯截圖

①data段中的資料為:0123H 0456H

②cs=cs=076CH,ss=076BH,ds=076AH

③設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1

④程式載入後,該段實際佔有空間為N+16個位元組

5.實驗任務5

assume cs:code, ds:data, ss:stack

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0,0
stack ends
end start

①data段中的資料為:0123H 0456H

②cs=cs=076AH,ss=076EH,ds=076DH

③設程式載入後,code段的段地址為X,則data段的段地址為X+3,stack段的段地址為X+4

6.實驗任務6

修改指令後執行截圖

第三個程式可以正確執行,因為預設進入的就是code段,第一第二個程式都將data段和stack段放在code段的前面,而第三個程式將data段和stack段放在code段後面,所以只有第三個程式可以正確執行。

7.實驗任務7

assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends

b segment
  db 1,2,3,4,5,6,7,8
b ends

c1 segment  
  db 8 dup(0)
c1 ends

code segment
start:
    mov ax, a
    mov ds, ax
    mov ax, b
    mov es, ax
    mov cx, 8
    mov di, 0
s:    mov bx, [di]
    add bx, es:[di]
    push ds
    mov ax, c1
    mov ds, ax
    mov [di], bx
    pop ds
    inc di
    loop s
          
    mov ax, 4c00h
    int 21h
code ends
end start

8.實驗任務8

assume cs:code
a segment
  dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
  dw 8 dup(0)
b ends

code segment
start: 
    mov ax,a
    mov ds,ax
    mov di,0
    mov ax,b
    mov ss,ax
    mov sp,10h
    mov cx,8

s:  push [di]
    add di,2
    loop s

    mov ax,4c00h
    int 21h
code ends
end start