Assembly 读取英特尔汇编8086清单文件

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

这是我的程序清单文件。然而,我被问到的问题是 第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
 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 opcode
75
是一个(相对跳转)
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操作码”,它们都是专门为它们执行的功能定义的。操作码的字节数将通过查看操作码的第一个或两个字节来确定,例如,显示了几个不同的跳转操作码。它是远、近还是短可以由第一个字节决定。太好了!我来看看。有时候,找到你几乎无法提问的信息是一项困难的任务。谢谢你的帮助!