簡體   English   中英

讀取intel組件8086清單文件

[英]Reading intel assembly 8086 listing file

這是我的程序清單文件。 但是,我問的問題是第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提取執行周期中,將提取一條指令,然后在執行該提取的指令之前 ,將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 跳回 -10h從下面的IP字節位置,以獲得對again:標簽。

跳躍距離很短的事實,使組裝人員能夠使用短距離跳躍 否則,如果距離大於128個字節,則需要一個不同的跳轉操作碼( 例如 ,如果它在64kB段內,則為近跳轉 -否則需要遠跳轉 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM