focus on linux, c/c++, lua

理解offset与call的使用

王爽《汇编语言》第九章提到了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 的具体值没什么关系的.


posted on 2010-10-20 10:14 zuhd 阅读(334) 评论(0)  编辑 收藏 引用 所属分类: my tips


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理