您的位置:首页 > 其它

第一、二章

2009-10-06 16:34 162 查看
1**********************************************************************************

问:代码中的ORG、ALIGN和SECTION真正的作用是什么?

答:

org(伪指令):二进制程序的起点位置

它指定程序被加载到内存时,程序的起始地址。比如,下面的代码会产生longword: '0x00000104':

org 0x100

dd label

label: ;前4个字节存放lable的值

跟 MASM 兼容汇编器提供的'org'操作符不同,它们允许你在目标文件中跳转,并覆盖掉你已经产生的代码,而 NASM 的'org'就象它的字面意思“起点”所表示的,它的功能就是为所有内部的地址引用增加一个段内偏移值
;它不允许 MASM 版本的'org'的任何其他功能。

section(伪指令):'SECTION'指令('SEGMENT'跟它完全等效)
改变你正编写的代码将被汇编进的段。

在 Flat-form Binary File 中没有什么实质性作用的。

某些目标文件格式中,段的数量与名称是确定的;而在别一些格式中,用户可以建立任意多的段。因此,如果你企图切换到一个不存在的段,'SECTION'有
时可能会给出错误信息,或者定义出一个新段,Unix
的目标文件格式和'bin'目标文件格式,都支持标准的段'.text','.data'和'bss'段,与之不同的是,'obj'格式不能辩识上面的段名,并需要把段名开头的句点去掉,即segment text, segment data, segment
bss.用windows下的nasm写代码时会遇到这种情况,另外对于'obj'格式还要加上程序入口标识 '..start:'。

align(宏):提供一种便捷的方式来进行数据或代码的在字,双字,段或其他边界上的对齐。
它有两个参数,并会计算需要多少字节来存储当前段,当然这个字节数必须向上对齐到一个 2
的幂值。然后用它的第二个参数来执行'TIMES'前缀进行对齐。如果第二个参数没有被指定,那'ALIGN'的缺省值就是'NOP'。除非有特殊用途,
一般不需要第二个参数。需要注意的是,这个宏不进行错误检查:第一个参数不是2的幂值或第二个参数大于一个字节的代码,
在这种情况下,它将会继续错误的做下去


2*************************************************************************

问:$和$$的含义

答:

NASM在表达式中支持两个特殊的记号,即'$'和'$$',它们允许引用当前指令的地址。'$'计算得到它本身所在源代码行的开始处的地址;所以你可以简单地写这样的代码'jmp $'来表示无限循环。'$$'计算当前段开始处的地址,所以你可以通过($-$$)找出你当前在段内的偏移。

(详见nasm中文文档:http://www.bafee.cn/JC/Prog2/ASM/2429_20081125181831B1711.HTML)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: