王爽老师汇编指令第三版实验8:分析一个奇怪的程序

assume cs:code
code segment
    mov ax, 4C00H
    int 21H
    start:
        mov ax, 0000H
        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, 0000H
            int 21H
            mov ax, 0000H
        s2:
            jmp short s1
            nop
code ends
end start

编译,debug一下,开始分析:

在这里插入图片描述

从R命令,可以获知:因为程序中DS075E 所以程序入口CS:ip = 076E:0005 指向的命令式 mov ax,0000,
对应机器码B80000

在这里插入图片描述

D命令查看下内容方便后面观察指令执行情况

在这里插入图片描述

T命令逐步执行指令,也就是上面的mov ax,0000,可以看到ip变成了0008(因为指令了一个指令,3个字节,后面不赘述)

在这里插入图片描述

nop占一个字节,因此没什么好说的
指令mov di,offset s对应mov di,0008编译后会自动计算s标记的offset,mov给di也就是0008
接下来也类似,计算s2标记的offset mov给si 对应mov si,0020
mov ax,cs:[si] 即cs:0020 = F6EB
mov cs:[0008],F6EB,看下内存变化

发现替换了nop对应的内容,可以看到下一条指令是jmp 0008

在这里插入图片描述

执行,Jmp 0000 但是根据EBF6其中EB对应jmp F6是偏移,计算补码
原:1111 0110
补:0000 1001 ==9 加一操作 10,由于原用于标记正负的最高位是1,
即表示负数,所以结果是-10 执行0008执行回去会跳到最开始的 0000 也就是 mov 4c00h那里
也就是黄色框框中的内容

在这里插入图片描述

因此正常退出程序

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43084928/article/details/83833283