阅读intel assembly 8086列表文件

时间:2015-04-15 19:26:16

标签: assembly

这是我的程序列表文件。但是,我问的问题是 F0 在第20行的重要性。我知道第一列代表地址偏移,第三列代表指令,但我们如何确定数据在这里的含义?

 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

1 个答案:

答案 0 :(得分:4)

操作码75short jump短跳是从跳转指令后面的指令的指令指针(IP)向前或向后小于128字节的相对跳转。 (注意:在标准CPU获取 - 执行周期中,取指令,然后在执行取指令之前,IP递增到下一条指令。)

 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

在这种情况下,您的完整操作码为:75F0。这是一个短跳转(如果Z标志为0)与签名字节值F0所代表的下一个IP的距离。 F0h的带符号值(作为2的补码有符号字节)为负10h,计算公式为:

  0000000F ; address of "again:" label
- 0000001F ; address of instruction after "jnz"
----------
        F0 ; difference in addresses

这告诉CPU从以下IP跳转返回 -10h字节位置,以便转到again:标签。

跳跃距离太短的事实,汇编程序能够使用短跳。否则,如果距离大于128个字节,则需要不同的跳转操作码(例如接近跳跃如果它在64kB段内 - 否则远跳是必需的。)