王爽《組合語言》(第三版) 實驗8、9:
阿新 • • 發佈:2019-02-13
下面的程式簡單分析了一下:
assume cs:code
code segment
mov ax, 4c00H
int 21h
start: mov ax, 0
s: nop
nop
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
;取得s和s2偏移地址分別存放到di和si中
;之後將s2處對應的指令轉移到s的第一個指令
s0: jmp short s
;跳轉到標號s處
;具體計算方法為s0處對應IP+2+位移(負數用補碼錶示)
;上面已經將s處的第一條指令更改為了s2的第一條指令
;所以會執行jmp short s1指令,但是實際上jmp short s1
;的機器碼還是s2相對於s1的位移,也就是EBF6
;F6為補碼錶示,-10,由於計算方法為s2對應IP+2-10
;故而最終結果就是指令被轉移到了s對應IP-8的位置
;s對應的IP為0008,因此,最後的結果就是執行cs:0000處
;的指令:mov ax, 4c00H,之後執行int 21H
;程式正常終止
s1: mov ax, 0
int 21h
mov ax, 0
s2: jmp short s1
nop
code ends
end start
debug全屏模式:alt+enter
實驗9:
程式碼:
assume cs:code
data segment
dw 57h, 65h, 6Ch, 63h, 6Fh, 6Dh, 65h, 20h, 74 h, 6Fh, 20h, 74h, 68h, 65h, 20h, 77h, 6Fh, 72h, 6Ch, 64h, 21h
data ends
code segment
start: mov ax, 0b800h
mov ds, ax
mov ax, data
mov es, ax
mov bx, 0
mov cx, 15h
s: mov al, es:[bx]
mov ah, 02h
mov ds:[bx], ax
add bx, 2
loop s
mov ax, 4c00h
int 21h
code ends
end start
效果: