nasm汇编之 BITS

摘要:我们都有感触,汇编语言不像C语言,没有可移植的特性,有intel的汇编,AT&T的汇编,win32汇编程序,IBM汇编程序,gas汇编程序,nasm汇编程序。那么这些汇编程序有什么区别?汇编语言的语法是指的什么?某些汇编语言中的BITS 32是什么意思呢?本文主要为你解决这些疑问。


1.开篇

汇编语言的语法风格,主要取决于底层硬件和使用的汇编器。汇编指令的两大风格分别是Intel汇编与AT&T汇编,分别被Microsoft Windows/Visual C++与Linux/gcc采用。nasm也是一种汇编器,用于将汇编程序转化成机器代码,它在AT&T汇编语言风格的基础上加入了自己独特的部分。


2.关于BITS

'BITS'指令指定NASM产生的代码是被设计运行在16位模式的处理器上还是运行在32位模式的处理器上。语法是'BITS 16'或'BITS 32'在大多数情况下,你可能不需要显式地指定'BITS'。


'aout','coff','elf'和'win32'目标文件格式都是被设计用在32位操作系统上的,它们会让NASM缺省选择32位模式。而'obj'目标文件格式允许你为每一个段指定'USE16'或'USE32',然后NASM就会按你的指定设定操作模式,所以多次使用'BITS'是没有必要的。


但是我们的Realinit.bin的开始部分代码,采用NASM编译,目标格式为BIN格式,即纯粹的二进制可执行文件,不带任何头文件。


最有可能使用'BITS'的场合是在一个纯二进制文件中使用32位代码;这是因为'bin'输出格式在作为DOS的'.COM'程序,DOS的'.SYS'设备驱动程序,或引导程序时,默认都是16位模式。如果你仅仅是为了在16位的DOS程序中使用32位指令,你不必指定'BITS 32',如果你这样做了,汇编器反而会产生错误的代码,因为这样它会产生运行在16位模式下,却以32位平台为目标的代码。       


当NASM在'BITS 16'状态下时,使用32位数据的指令可以加一个字节的前缀0x66,要使用32位的地址,可以加上0x67前缀。在'BITS 32'状态下,相反的情况成立,32位指令不需要前缀,而使用16位数据的指令需要0x66前缀,使用16位地址的指令需要0x67前缀。'BITS'指令拥有一个等效的原始形式:[BITS 16]和[BITS 32]。而用户级的形式只是一个仅仅调用原始形式的宏。


在操作数大小不显式指明的时候用,比如:
push 0 ;既可以是push 0000 也可以是 push 00000000
编译器需要知道push后面几个字节是需要入栈的数,来生成适合16位模式或32位模式的代码。






你可能感兴趣的:(汇编语言,nasm,实模式与保护模式,bits32)