nasm 语法

原创 2015年11月18日 22:12:40

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:启动存储器








版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

nasm 中文手册

Nasm中文手册 --------------------------------------------------------------------------------第一章: 简介---...
  • erazy0
  • erazy0
  • 2010年04月05日 18:35
  • 2280

学习 nasm 语言

学习 nasm 语言 返 回 3. nasm assembly 语法 3.1 nasm 是匹分大小写3.2 内存操作数表达式 3.2.1 在 nasm 语法里,对 memory 操...
  • mydo
  • mydo
  • 2012年12月30日 13:05
  • 2733

[Intel汇编-NASM]基本语法

1. NASM编译器介绍:     1) Netwide Assembler,是目前唯一开源且免费的汇编器;     2) 该汇编器只提供编译的功能,但不提供连接的功能,在Linux下编译器产生.o文...

NASM语法

要汇编一个文件,你可以以下面的格式执行一个命令: nasm -f [-o ] 比如, 会把文件'myfile.asm'汇编成'ELF'格式 的文件'myfile.o'.还有: n...

NASM 帮助文档 语法

  • 2011年05月06日 16:09
  • 674KB
  • 下载

linux汇编工具之GAS(AT&T 语法)和NASM(Intel 语法)比较

前言:在学校时,学过的汇编是Intel语言的汇编,编译器是MASM,使用的是DOS系统。惭愧的是那时没有对汇编语言有较深入的研究,有许多问题也不慎了解,迷迷糊糊至今。最近,在看《使用开源软件-自己写操...

NASM入门教程(part1)

From: Introduction to NASM A Study Material for CS2093-Hadware Laboratory 国外的一份NASM学习汇编的学习资料,对于有计算机组...

nasm : 屏幕打印语句的实现

就像应用层编程一样,如果不借助第三方工具和调试器,要知道程序哪里出了问题,需要记录日志. bochs和真机还是有点区别的, 前几天搞出了打印语句, 拖到今天,实验环境搞定后,才在真机上验证通过. ...

NASM

1.下载NASM NASM--Netwide Assembler 免费开源软件 点此下载 2.编译汇编代码 用记事本写好汇编代码后保存为.asm文件(文件扩展名任意),注意文件和NASM在一个目...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nasm 语法
举报原因:
原因补充:

(最多只允许输入30个字)