灰灰灰 发表于 2017-10-17 13:52:14

实验8有一点不能理解,求大神

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:
          mov cs:,ax
          
        s0:jmp short s
       
        s1:mov ax,0
        int 21h
        mov ax,0
       
        s2:jmp short s1
           nop
          
        codesg ends
        end start

这是实验八的程序,执行到s2的时候机器指令是ebf6,然后跳转到s,然后上移10个字节,到了mov ax,4c00h,但是为什么s2处的指令是ebf6呢,s2:jmp short s1,这是跳转到s1,但是s2,s1之间只有五个字节啊,为什么是f6要移动十个字节呢?

丶忘却的年少o 发表于 2017-10-17 14:20:12

当指令执行到s0:jmp short s时,该指令得到执行,编译器算出的ip位移量为8-18h=-16(补码F0),(ip)=(ip)+位移量=18h+(-16)=8,cs:8指向s;
当指令执行到s标段jmp命令时,第1个字节中的机器码为EBF6,给出的ip位移量为-10(补码F6),(ip)=(ip)+位移量=ah+(-10)=0,cs:0指向第一条指令。

灰灰灰 发表于 2017-10-17 14:48:54

丶忘却的年少o 发表于 2017-10-17 14:20
当指令执行到s0:jmp short s时,该指令得到执行,编译器算出的ip位移量为8-18h=-16(补码F0),(ip)=(ip)+位 ...

可是s的ip为0008,上移十个字节,也不是mov ax,4c00h,
(ip)=(ip)+位移量=ah+(-10)为什么等于0???

丶忘却的年少o 发表于 2017-10-17 15:49:36

灰灰灰 发表于 2017-10-17 14:48
可是s的ip为0008,上移十个字节,也不是mov ax,4c00h,
(ip)=(ip)+位移量=ah+(-10)为什么等于0???

不好意思,啰嗦一下。你直接看最后一段红色段就可以了,要是不明白可以全部看完。
首先程序从上往下下来会把s2标号的代码赋值到s标号的地方,然后再执行s0标号的代码,s0是要程序跳到s标号的地方,这里都是没问题的。
这个时候s标号因为已经复制过来程序了,就编程s2标号一模一样的指令,而我们知道跳转只有方向和偏移的。正常的来看s2标号的代码,它要跳到s1,方向是往上,偏移是10。回到s标号的代码这里来,上一段已经说过了,程序现在执行到的地方是s标号。
s标号的程序那就是要 方向是往上,偏移是10,按照这个跳转,而s标号的开始ip = 0008,jmp指令占2字节,执行完指令后才会跳转,那不刚好是 10,然后 10-10 = 0。

灰灰灰 发表于 2017-10-18 12:59:16

丶忘却的年少o 发表于 2017-10-17 15:49
不好意思,啰嗦一下。你直接看最后一段红色段就可以了,要是不明白可以全部看完。
首先程序从上往下下来 ...

嗯嗯,这一点我懂了,可是s0和s2之间的偏移量为什么是十个字节啊,一共不是cd 21 b8 00 00五个字节吗?

丶忘却的年少o 发表于 2017-10-18 13:13:59

灰灰灰 发表于 2017-10-18 12:59
嗯嗯,这一点我懂了,可是s0和s2之间的偏移量为什么是十个字节啊,一共不是cd 21 b8 00 00五个字节吗?

唉,就是上面那句红色的话。换个说法好了,机器码太难说,看你发的图
看图,s2开始的语句是jmp,前面的地址是076A:20,s1开始的语句地址是076A:18。但是程序是先运行完这句话再执行的跳转,这个要清楚,就是说先运行完jmp语句,才能跳!
如果没猜错的话,你截的图的下一句语句地址是076A:22,加入有一个箭头,在运行完jmp语句后箭头的位置在076A:22,然后箭头要往上跳到标号s1的地方,地址是076A:18,减一下,22H-18H = AH,就是10。

灰灰灰 发表于 2017-10-18 14:52:53

丶忘却的年少o 发表于 2017-10-18 13:13
唉,就是上面那句红色的话。换个说法好了,机器码太难说,看你发的图
看图,s2开始的语句是jmp,前面的 ...

嗯嗯,懂了,我理解的还是不够深。。。谢谢了~

丶忘却的年少o 发表于 2017-10-18 15:53:09

灰灰灰 发表于 2017-10-18 14:52
嗯嗯,懂了,我理解的还是不够深。。。谢谢了~

别忘记点下“最佳答案”呀
页: [1]
查看完整版本: 实验8有一点不能理解,求大神