jli 发表于 2020-6-27 21:04:47

作业题求助汇编大佬,如下图

机器码和汇编指令如下图所示,第六条机器码的偏移值为什么是F7?
机器码        汇编指令
40                s:inc ax
90                nop
90                nop
BB0200        mov bx,2
43                inc,bx
EBF7                jmp s
90                nop

CodingCat_k 发表于 2020-6-27 21:04:48

通过DEBUG就很明显的可以发现规律,指令也是存储在内存单元中的数据,每条指令虽然长短不一,但是都是8字节存放;
jmp s翻译之后是EB 相对当前IP长度
又因为8086采用的是小端法(低地址存数据低位),从标号s到jmp s指令一共占据了9个内存单元,而一般指令执行顺序是从前到后,但是现在却是向前跳
所以就需要计算一共向前跳几个内存单元(jmp指令本身也算);所以请楼主自行计算下-9的补码。
换言之,我们知道,IP指向的是下一条指令所在内存单元,所以也可以理解成通过jmp指令控制IP跳跃的步数。
最好的体会还是自行修改程序,比如测试不同的s标号点,从后往前或者从前往后跳。

jhanker 发表于 2020-6-28 16:02:21

CodingCat_k 发表于 2020-6-28 15:32
通过DEBUG就很明显的可以发现规律,指令也是存储在内存单元中的数据,每条指令虽然长短不一,但是都是8字节 ...

高手说的很对
40                s:inc ax
90                nop
90                nop
BB0200      mov bx,2
43                inc,bx
EBF7                jmp s

jmp s 的两个字节 到 S:标记处往上数 需要9个字节 所以跳转 -9
补码 9取反加一(二进制)F7

CodingCat_k 发表于 2020-6-28 16:57:04

jhanker 发表于 2020-6-28 16:02
高手说的很对
40                s:inc ax
90                nop


高手谈不上,就是看过一点点汇编{:10_284:}

jli 发表于 2020-6-28 19:36:58

CodingCat_k 发表于 2020-6-28 15:32
通过DEBUG就很明显的可以发现规律,指令也是存储在内存单元中的数据,每条指令虽然长短不一,但是都是8字节 ...

666学习了~

jli 发表于 2020-6-28 19:37:36

jhanker 发表于 2020-6-28 16:02
高手说的很对
40                s:inc ax
90                nop


都是高手 我是弟弟~
页: [1]
查看完整版本: 作业题求助汇编大佬,如下图