Assembly 读取英特尔汇编8086清单文件
这是我的程序清单文件。然而,我被问到的问题是 第20行F0的意义。我知道第一列表示地址偏移量,第三列表示指令,但是我们如何理解数据在这里的含义呢Assembly 读取英特尔汇编8086清单文件,assembly,Assembly,这是我的程序清单文件。然而,我被问到的问题是 第20行F0的意义。我知道第一列表示地址偏移量,第三列表示指令,但是我们如何理解数据在这里的含义呢 1 ; 2 ; 3 ; 4 section .data 5 6 00000000 0102030405 number: db 1,2,3,4,5 7 00000005 00 sum: db 0 8 9
1 ;
2 ;
3 ;
4 section .data
5
6 00000000 0102030405 number: db 1,2,3,4,5
7 00000005 00 sum: db 0
8
9
10 section .text
11 global _start
12
13 _start:
14 00000000 B905000000 keith: mov ecx, 5
15 00000005 B800000000 ron: mov eax, 0
16 0000000A BB[00000000] mov ebx, number
17 0000000F 0203 again: add al, [ebx]
18 00000011 81C301000000 add ebx,1
19 00000017 81E901000000 sub ecx,1
20 0000001D 75F0 jnz again
21 0000001F A2[05000000] mov [sum], al
22
23 00000024 B801000000 mov eax,1
24 00000029 BB00000000 mov ebx,0
25 0000002E CD80 int 80h
操作码
75
是一个密码。短跳转是相对于跳转指令之后的指令指针(IP)的向前或向后距离小于128字节的相对跳转。(注意:在标准的CPU fetch execute循环中,将获取一条指令,然后在执行获取的指令之前将IP递增到下一条指令。)
在这种情况下,您的完整操作码是:75F0
。这是一个短跳转(如果Z标志为0),距离下一个IP的距离由有符号字节值表示,F0
。F0h
的有符号值作为2的补码有符号字节,为负10h
,计算如下:
0000000F ; address of "again:" label
- 0000001F ; address of instruction after "jnz"
----------
F0 ; difference in addresses
这告诉CPU从以下IP跳回-10h
字节位置,以便再次到达标签
由于跳远距离很短,装配工能够使用跳远。否则,如果距离大于128字节,则需要另一个跳转操作码(例如,如果在64kB段内,则需要近跳转,否则需要远跳转)。操作码75
是一个错误。短跳转是相对于跳转指令之后的指令指针(IP)的向前或向后距离小于128字节的相对跳转。(注意:在标准的CPU fetch execute循环中,将获取一条指令,然后在执行获取的指令之前将IP递增到下一条指令。)
在这种情况下,您的完整操作码是:75F0
。这是一个短跳转(如果Z标志为0),距离下一个IP的距离由有符号字节值表示,F0
。F0h
的有符号值作为2的补码有符号字节,为负10h
,计算如下:
0000000F ; address of "again:" label
- 0000001F ; address of instruction after "jnz"
----------
F0 ; difference in addresses
这告诉CPU从以下IP跳回-10h
字节位置,以便再次到达标签
由于跳远距离很短,装配工能够使用跳远。否则,如果距离大于128字节,则需要另一个跳转操作码(例如,如果在64kB段内,则需要近跳转,否则需要远跳转)。jnz再次
has opcode75
是一个(相对跳转)F0
读取为有符号字节偏移量,是-10h
,这也是的距离:
标签距离jnz之后的IP的距离。换句话说,当以有符号字节算术完成时,F0=0F-1F
。它告诉CPU向后跳转10h
字节。jnz再次
具有操作码75
是一个(相对跳转)F0
读取为有符号字节偏移量,是-10h
,这也是的距离:
标签距离jnz之后的IP的距离。换句话说,当以有符号字节算术完成时,F0=0F-1F
。它告诉CPU向后跳转10h
字节。哦,我明白了。但是在这种情况下,你怎么知道75是操作码呢?一些指令为6字节,其他指令为5字节,jnz指令仅为2字节。如果我知道75是操作码,那可能会暗示我F0实际上在偏移量上…@Dimitri如果你查找“x86操作码”,它们都是专门为它们执行的功能定义的。操作码的字节数将通过查看操作码的第一个或两个字节来确定,例如,显示了几个不同的跳转操作码。它是远、近还是短可以由第一个字节决定。太好了!我来看看。有时候,找到你几乎无法提问的信息是一项困难的任务。谢谢你的帮助!哦,我明白了。但是在这种情况下,你怎么知道75是操作码呢?一些指令为6字节,其他指令为5字节,jnz指令仅为2字节。如果我知道75是操作码,那可能会暗示我F0实际上在偏移量上…@Dimitri如果你查找“x86操作码”,它们都是专门为它们执行的功能定义的。操作码的字节数将通过查看操作码的第一个或两个字节来确定,例如,显示了几个不同的跳转操作码。它是远、近还是短可以由第一个字节决定。太好了!我来看看。有时候,找到你几乎无法提问的信息是一项困难的任务。谢谢你的帮助!