王爽《匯編語言》第九章提到了offset指令,指令可以取得標(biāo)號處的偏移地址,但是如何計(jì)算這個(gè)偏移地址?按照一條指令2個(gè)字節(jié)的標(biāo)準(zhǔn)進(jìn)行遞推?
問題如下:
assume cs:code
data segment
dw 8 dup(0)
data ends
code segment
start: mov ax, data
mov ss, ax
mov sp, 16
mov word ptr ss:[0], offset s
mov ss:[2], cs
call dword ptr ss:[0]
nop
s:
mov ax, offset s
sub ax, ss:[0ch]
mov bx, cs
sub bx, ss:[0eh]
code ends
end start
-----------------------------------------------------------------------------------------------------------------
其實(shí), 看這個(gè)代碼不是這個(gè)意思. 這個(gè)題目的目的是檢查 call 指令的執(zhí)行流程以及堆棧的結(jié)構(gòu)和數(shù)據(jù)安排, 和 offset 倒是關(guān)系不大.
call dword ptr 指令將返回的地址, 就是該 call 指令的下一條指令的地址, 就是那個(gè) nop 指令的地址壓棧到 ss:sp 處. 這里就是 ss:[0ch]=nop指令的偏移地址; ss:[0eh]=nop指令的段址.
后來的相減指令就是將 s: 的地址和 nop 指令的地址相減, 結(jié)果嘛, 就是 nop 指令的長度了, 即 bx=0, ax=1. 與 offset s 的具體值沒什么關(guān)系的.