王爽《汇编语言》第九章提到了offset指令,指令可以取得标号处的偏移地址,但是如何计算这个偏移地址?按照一条指令2个字节的标准进行递推?
问题如下:
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
-----------------------------------------------------------------------------------------------------------------
其实, 看这个代码不是这个意思. 这个题目的目的是检查 call 指令的执行流程以及堆栈的结构和数据安排, 和 offset 倒是关系不大.
call dword ptr 指令将返回的地址, 就是该 call 指令的下一条指令的地址, 就是那个 nop 指令的地址压栈到 ss:sp 处. 这里就是 ss:[0ch]=nop指令的偏移地址; ss:[0eh]=nop指令的段址.
后来的相减指令就是将 s: 的地址和 nop 指令的地址相减, 结果嘛, 就是 nop 指令的长度了, 即 bx=0, ax=1. 与 offset s 的具体值没什么关系的.