关闭

nasm 语法

395人阅读 评论(0) 收藏 举报
分类:

NASM 语法:
在 NASM 汇编语言里,每条指令的前面都可以拥有一个标号,以代表和指示该指令的汇编地
址。毕竟,由我们自己来计算和跟踪每条指令所在的汇编地址是极其困难的。这里有一个很好的例
子,比如源程序第 98 行:
infi: jmp near infi
在这里,行首带冒号的是标号是“infi”。请看表 5-3,这条指令的汇编地址是 0x0000012D,故
infi 就代表数值 0x0000012D,或者说是 0x0000012D 的符号化表示。
标号之后的冒号是可选的。所以下面的写法也是正确的:
infi jmp near infi
标号并不是必需的,只有在我们需要引用某条指令的汇编地址时,才使用标号。正是因为这样,
本章源程序中的绝大多数指令都没有标号。
标号可以单独占用一行的位置,像这样:
infi:
jmp near infi
这种写法和第 98 行相比,效果并没有什么不同,因为 infi 所在的那一行没有指令,它的地址
就是下一行的地址,换句话说,和下一行的地址是相同的。

标号可以由字母、数字、“_”、“$”、“#”、“@”、“~”、“.”、“?”组成,但必须以字母、“.”、
“_”和“?”中的任意一个打头。

1:NASM 使用反斜杠(\)作为续行符,如果一个以上反斜线结束,那第二行会被认为是前面一行的一部分

2:NASM中一个标识符可以加上一个$前缀,以表明它被作为一个标识符而不是保留字来处理
   这样的话,如果你想到链接进来的其他模块中定义了一个符号叫'eax',你可以用'$eax'在
     NASM代码中引用它,以和寄存器的符号区分开。
 
3.4.1 数值常数。
一个数值常数就只是一个数值而已。NASM允许你以多种方式指定数值使用的
进制,你可以以后缀'H','Q','B'来指定十六进制数,八进制数和二进制数,
或者你可以用C风格的前缀'0x'表示十六进制数,或者以Borland Pascal风
格的前缀'$'来表示十六进制数,注意,'$'前缀在标识符中具有双重职责
(参阅3.1),所以一个以'$'作前缀的十六进制数值必须在'$'后紧跟数字,而
不是字符。
请看一些例子:
mov ax,100 ; decimal
mov ax,0a2h ; hex
mov ax,$0a2 ; hex again: the 0 is required
mov ax,0xa2 ; hex yet again
mov ax,777q ; octal
mov ax,10010011b ; binary

3.4.2 字符型常数。
一个字符常数最多由包含在双引号或单引号中的四个字符组成。引号的类型
与使用跟NASM其它地方没什么区别,但有一点,单引号中允许有双引号出现。
一个具有多个字符的字符常数会被little-endian order,如果你编写:
mov eax,'abcd'
产生的常数不会是`0x61626364',而是`0x64636261',所以你把常数存入内存
的话,它会读成'abcd'而不是'dcba'。这也是奔腾的'CPUID'指令理解的字符常
数形式(参阅B.4.34)

3.4.3 字符串常数。

DB 就是Date Byte的简写,我喜欢简称为Define Byte,就是定义一个字节。

DW :data word.   DD:data double-word.

RESB 16 ;Reserve byte  预留16个字节0.

字符串常数一般只被一些伪操作指令接受,比如'DB'类,还有'INCBIN'。
一个字符串常数和字符常数看上去很相像,但会长一些。它被处理成最大长
度的字符常数之间的连接。所以,以下两个语句是等价的:
db 'hello' ; string constant
db 'h','e','l','l','o' ; equivalent character constants
还有,下面的也是等价的:
dd 'ninechars' ; doubleword string constant
dd 'nine','char','s' ; becomes three doublewords
db 'ninechars',0,0,0 ; and really looks like this
注意,如果作为'db'的操作数,类似'ab'的常数会被处理成字符串常量,因
为它作为字符常数的话,还不够短,因为,如果不这样,那'db 'ab'会跟
'db 'a''具有同样的效果,那是很愚蠢的。同样的,三字符或四字符常数会
在作为'dw'的操作数时被处理成字符串。

3.4.4 浮点常量
浮点常量只在作为'DD','DQ','DT'的操作数时被接受。它们以传统的形式表
达:数值,然后一个句点,然后是可选的更多的数值,然后是选项'E'跟上
一个指数。句点是强制必须有的,这样,NASM就可以把它们跟'dd 1'区分开,
它只是声明一个整型常数,而'dd 1.0'声明一个浮点型常数。

dd 1.2 ; an easy one
dq 1.e10 ; 10,000,000,000
dq 1.e+10 ; synonymous with 1.e10
dq 1.e-10 ; 0.000 000 000 1
dt 3.141592653589793238462 ; pi
NASM不能在编译时求浮点常数的值。这是因为NASM被设计为可移植的,尽管它
常产生x86处理器上的代码,汇编器本身却可以和ANSI C编译器一起运行在任
何系统上。所以,汇编器不能保证系统上总存在一个能处理Intel浮点数的浮
点单元。所以,NASM为了能够处理浮点运算,它必须含有它自己的一套完整
的浮点处理例程,它大大增加了汇编器的大小,却获得了并不多的好处。

3.5 表达式
NASM中的表达式语法跟C里的是非常相似的。
NASM不能确定编译时在计算表达式时的整型数尺寸:因为NASM可以在64位系
统上非常好的编译和运行,不要假设表达式总是在32位的寄存器中被计算的,
所以要慎重地对待整型数溢出的情况。它并不总能正常的工作。NASM唯一能
够保证的是:你至少拥有32位长度。
NASM在表达式中支持两个特殊的记号,即'$'和'$$',它们允许引用当前指令
的地址。'$'计算得到它本身所在源代码行的开始处的地址;所以你可以简
单地写这样的代码'jmp $'来表示无限循环。'$$'计算当前段开始处的地址,
所以你可以通过($-$$)找出你当前在段内的偏移。


启动存储器(软盘,磁盘,U盘,光驱均可)第一个扇区称为启动区,他的最后两个字节,510,511字节固定为:0x55,0xAA。一个扇区固定为512字节。

---计算机首先从存储器读第一个扇区,如果他的最后两个字节是55aa,则此存储器为启动存储器(操作系统在其中),开始运行第一个扇区的启动程序;如果不是,则继续查找下一个存储器(软盘,光驱,U盘等)。

IPL:Initial Program Loader,启动程序加载器,将OS加载到内存中。 55aa:启动存储器








0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:167806次
    • 积分:4891
    • 等级:
    • 排名:第6022名
    • 原创:251篇
    • 转载:508篇
    • 译文:1篇
    • 评论:73条
    最新评论