下面的程序简单分析了一下:
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, 74h, 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
效果: