实验内容
分析下面的程序,在运行前思考:这个程序可以正确返回吗?
运行后思考:为什么会是这种结果?
通过这个程序加深对相关内容的理解。
assume cs:codesg
codesg 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
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
此代码可以正常运行返回,如以下截图:
可以看到代码运行后正确返回,等待下一步指令。
分析
我们用debug单步调试观察一下啊:
代码经过编译器编译后,从指定的start入口进入,因此第一条指令位mov ax,0,然后我们单步执行到jmp short s之前,如下,然后观察以上几步运行结果,看是否按照我们要求将代码复制到指定位置处,复制完后存在的是机器指令EBF6,因此cpu运行的是EBF6,EBF6是什么意思,这是一个相对转移的指令,其中EB是转移指令,F6是偏移量,可见F6是-10,即相对现在机器码所在位置(包括机器码本身,可以理解为此指令的下一条指令的起始位置)向前位移10个机器码。而10个机器码刚好跳到开始的0000处去执行mov ax,4c00h int 21h,因此程序正常运行。
总结
cpu只识别机器码指令,如此题就只认识EBF6,就只按照这条指令去执行。