汇编学习-实验八分析一个奇怪的程序
代码如下:
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
1. 首先程序从start处开始运行,四句mov指令实际将s2段的第一条指令复制到了s段的第一条
2. 接着当运行到s0时程序跳转到s处,此时s处的指令是jmp short s1,然而这并不是这条指令的实际目的,在程序编译时,jmp short s1被编译成了内存位移确定目标位置,即EBF6
3. 其中EB表示jmp,F6表示目标地址相对目前的ip的偏移,用补码表示
4. f6的十进制数位-10,往前挪十位,可以发现,SIZE(FEB6)+SIZE(MOV AX,0)+SIZE(MOV AX,4C00H)+SIZE(INT 21H)==10,因此程序直接跳转到mov ax,4ch开始执行,进入程序结束阶段