自学中碰到的疑点,希望达人指教

ovmem 2004-11-21 02:36:06
1.觉得《80X86汇编语言程序设计教程》第78页关于'$'的说明有错,以下是部分文字:

> 汇编语言用符号'$'表示ip的当前值
>…………
>例如下面的语句表示跳过8字节的存储区:
>org $+8

> 当'$'在指令中时他表示本指令第一字节的地址偏移。例如下面的指令表示转移到当前指令第一字节后6字节处
>jmp $+8

>当$用在伪指令的参数中时,它表示ip的当前值。例如:
>ARRAY dw 1,2,$+4,3,4,$+4
>设ARRAY分配的地址偏移是100h,那么汇编后相应的存储情况如下

单元 地址
01 100
00
02 102
00
08 104
00
03 106
00
04 108
00
0E 10A
00
……
————————————————————————————————————————————
我用emu8086试验过,书上的描述从“org $+8”这句以后就全错了,
“当'$'在指令中时他表示本指令第一字节的地址偏移”
应该改为
“当'$'在指令中时他表示本指令 下一个 字节的地址偏移”

以下是试验结果(ip初值为100h):

“jmp $+6”这句汇编后变成 “jmp 0108h”(短jmp语句占两个byte,执行完后ip=0102h,所以0102h+6h=0108h)

ARRAY的内容也同试验结果不同,结果如下(ip初值为100h):
单元 地址
01 100
00
02 102
00
04 104
00
03 106
00
04 108
00
04 10A
00
……
我猜104h 和 10Ah 这两字节变量不会变成08,00 和 0E,00是因为这是伪操作,在汇编时ip值是不变的。
但问题就是为什么这两个单元的内容不是 04,01 ???(ip的初值是0100h,0100h+4h=0104h)
*****************************************************************************************
2.
还有书上的一个问题,不太懂,见下:
>源程序是否一定要以END语句结束?程序是否一定冲代码段的偏移0开始执行?如果不是该如何指定?

*****************************************************************************************
请哥哥姐姐不吝赐教
...全文
55 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ovmem 2004-11-21
  • 打赏
  • 举报
回复
感谢clumsy的解答
zhuying1983 2004-11-21
  • 打赏
  • 举报
回复
104中的数是0108,有什么不对的,我刚刚测试过
clumsy 2004-11-21
  • 打赏
  • 举报
回复
1. org $+8 就是在当前位置预留了 8 个字节的 00 值吧, 其后的内容继续. 没有问题啊
jmp $+6, 如果 IP=100h 的话, 目标地址应该是 106h, 不是 108h. 即该指令的机器码为: EB 04
上面的两个语句, 在 Masm5 和 Masm6 编译的结果都是这样的, 所以, 如果你使用 emu8086 和这个不一样的话, 恐怕就是 emu8086 的问题了
ARRAY dw 1,2,$+4,3,4,$+4
这个, 在 Masm5 和 Masm6 里面的结果是不一样的! Masm5 的结果和你提到的 emu8086 中的一致, 但是, Masm6 和你所设想的是一样的. 这个现象的解释嘛, 其实也没有什么好说的了, 就象是在 c 里面, 一些比较特殊的语句, 不同的编译器最后生成的代码不一样似的. 个人觉得没有必要在这个上面缠上多少的时间.

2. 源程序是一定要以 END 语句结束的. 程序不是一定要从代码段的 0000 处开始执行的. END 语句后面可以跟标号的, 这个标号就是你的程序要开始执行的地方. 如果使用 Masm6.0 或以上版本的话, 还可以使用 .STARTUP 语句来指定程序应该从那里开始执行.

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧