任务

分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后再思考:为什么是这种结果?
通过这个程序加深对相关内容的理解。

回答

可以正确返回,分析如下面代码中的注释

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]      ; 把si指向的s2中的jmp short s1指令复制到di指向的s标识处
    mov cs:[di],ax

s0:
    jmp short s     ; 跳到s标识, 此时s标识处的指令为jmp short s1是复制到s处的指令,但因为是近转移,所以从s标识-8字节,会从code段第一条开始

s1:
    mov ax,0
    int 21h
    mov ax,0

s2:
    jmp short s1
    nop

code ends

end start