当前行被汇编后的地址

[复制链接]
查看11 | 回复4 | 2009-9-19 10:44:01 | 显示全部楼层 |阅读模式
我觉得你问的问题不是很明确。不过nasm是一个宏汇编器。$就是一个宏。他会在第一次扫描之后尝试展开。也就是说nasm首先对你的代码编译一次,把能够编译的先编译。此时剩下$等符号,然后从头开始替换掉。可以这样理解源程序:.....mov ax,$+7.....第一次扫描后.....xxxx: mov ax,7.....第二次扫描后.....xxxx: mov ax,7+xxxx ->完成....当然有些情况很复杂,比如jz之类的指令它的长度一次扫描可能不能确定,那可能会进行多次扫描。实际情况很复杂,我就简明介绍一下。如果看不懂可以提问。
回复

使用道具 举报

千问 | 2009-9-19 10:44:01 | 显示全部楼层
我来说两句;其实你知道当前程序地址意义不是特别大,非要看的话,你可以打开反汇编窗口,看前面的地址就知了(见附图:51的反汇编窗口);如果你用跳转指令的话,直接用标志符简单多了,而且出错的机率也少;很多单片机一条指令会占两个或三个字节的flash空间。


回复

使用道具 举报

千问 | 2009-9-19 10:44:01 | 显示全部楼层
$$,$只有汇编的时候起作用,$是全局的地址计数器,娄遇到一个声明段的伪指令时,$$并不清零,而是将$中的值赋给$$
回复

使用道具 举报

千问 | 2009-9-19 10:44:01 | 显示全部楼层
在开始的地方设置或者默认(没有设置的话)一个地址(应该可以默认吧,不设置编译一下试试)(编译器改置一个变量记录)。然后逐句编译汇编指令(把指令长度加到这个变量上)。直到$行,这时候这个变量的值就是当前行汇编后的地址。
回复

使用道具 举报

千问 | 2009-9-19 10:44:01 | 显示全部楼层
这个地址是根据你前面有多少指令,每条指令的长度相加算出来的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行