nasm特性

伪指令即不是真实的机器指令,当前的伪指令有

DB, DW, DD, DQ, DT, DO, DY and DZ 用来声明初始化数据,可以用逗号隔开

db - 1个字节
dw - 2个字节
dd - 4个字节
dq - 8个字节
dt - 10个字节
do ddq - 16字节
dy - 32字节
dz - 64字节

DT DO DY DZ 不接受数字常量操作符

db 0x55                  ;字节 0x55
db 0x55,0x56,0x57        ;3个连续字节
db 'a',0x55              ;字符也可以
db 'hello',13,10,'$'     ;8个字节
dw 0x1234                ;0x34 0x12
dw 'a'                   ;0x61 0x00
dw 'ab'                  ;0x61 0x62
dw 'abc'                 ;0x61 0x62 0x63 0x00
dd 0x12345678            ;0x78 0x56 0x34 0x12
dd 1.234567e20           ;浮点常量
dq 0x123456789abcdef0    ;8字节常量
dq 1.234567e20           ;双精度浮点
dt 1.234567e20           ;扩展精度浮点

resb

保留空间指令,RESB, RESW, RESD, RESQ, REST, RESO, RESY, RESZ 被设计用在 BSS 段,声明未初始化存储空间

buffer: resb 64         ;保留64字节
wordvar: resw 1         ;保留2个字节
realarray resq 10       ;保留10个8字节数组
ymmval: resy 1          ;保留32字节,相当于一个YMM寄存器大小(256位)
zmmvals: resz 32        ;保留64字节,相当于一个ZMM寄存器大小(512位)

incbin

包含外部二进制文件到输出文件

incbin "file.dat"              ;包含整个文件
incbin "file.dat",1024         ;跳过 1024 字节
incbin "file.dat",1024,512     ;跳过1024, 最多包含 512 字节

equ

定义常数,定义后不能再改变

message db 'hello, world'
msglen  equ  $−message

此时,msglen 就被定义为12,后面不能再被重定义

times

这个前缀代表定义多次的意思,下面定义了64个0的空间

zerobuf: times 64 db 0

也可以跟数字表达式

buffer: db 'hello, world'
times 64−$+buffer db ''

也可以跟指令

times 100 resb 1
resb 100

上面2个都是保留100个字节的意思,只是第2条速度更快而已

times指令不能用于宏命令,因为times是在宏处理阶段之后

有效地址,必须用中括号

wordvar dw 123
mov ax,[wordvar]
mov ax,[wordvar+1]
mov ax,[es:wordvar+bx]

下面没必要,但是也是合法的

mov eax,[ebx*5]             ;assembles as [ebx*4+ebx]
mov eax,[label1*2−label2]   ;ie [label1+(label1−label2)]

[eax*2+0] 和 [eax+eax] 写法nasm会自动选择后面这种

[esi+ebp] [ebp+esi] 有不同的默认段寄存器

默认的偏移单位为1个字节,当然也可以自己制定改变比如

[dword eax+3]   ;[eax+12] - 4*3
[word eax+2]    ;[eax+4] - 2*2


常数

数字常数

16进制 h|x 结尾,0x开头,$ 开头后面必须跟数字,0h

10进制 d|t 结尾,0t

8进制 q|o 结尾,0o,0q

2进制 b|y 结尾,0b,0y

数字常数可以包含下划线_当做分割线

mov ax,200 ; decimal
mov ax,0200 ; still decimal
mov ax,0200d ; explicitly decimal
mov ax,0d200 ; also decimal
mov ax,0c8h ; hex
mov ax,$0c8 ; hex again: the 0 is required
mov ax,0xc8 ; hex yet again
mov ax,0hc8 ; still hex
mov ax,310q ; octal
mov ax,310o ; octal again
mov ax,0o310 ; octal yet again
mov ax,0q310 ; octal yet again
mov ax,11001000b ; binary
mov ax,1100_1000b ; same binary constant
mov ax,1100_1000y ; same binary constant once more
mov ax,0b1100_1000 ; same binary constant yet again
mov ax,0y1100_1000 ; same binary constant yet again


字符串

可以用单引号,双引号,反引号括起来,反应好支持像C的转义

\' single quote (')
\" double quote (")
\` backquote (`)
\\ backslash (\)
\? question mark (?)
\a BEL (ASCII 7)
\b BS (ASCII 8)
\t TAB (ASCII 9)
\n LF (ASCII 10)
\v VT (ASCII 11)
\f FF (ASCII 12)
\r CR (ASCII 13)
\e ESC (ASCII 27)
\377 Up to 3 octal digits − literal byte
\xFF Up to 2 hexadecimal digits − literal byte
\u1234 4 hexadecimal digits − Unicode character
\U12345678 8 hexadecimal digits − Unicode character
db `\u263a` ; UTF−8 smiley face
db `\xe2\x98\xba` ; UTF−8 smiley face
db 0E2h, 098h, 0BAh ; UTF−8 smiley face


字符常数,小端存储,比如下面为0x64636261

mov eax,'abcd'

unicode strings

特殊的操作符有 __utf16__ __utf16le__  __utf16be__  __utf32__  __utf32le__  __utf32be__,默认为小端,utf-8

%define u(x) __utf16__(x)
%define w(x) __utf32__(x)
dw u(’C:\WINDOWS’), 0         ;Pathname in UTF−16
dd w(‘A + B = \u206a‘), 0     ;String in UTF−32

浮点数例子

浮点数只能为 db dw dd dq dt do 的参数,也可以为这些特殊操作符的参数 __float8__, __float16__, __float32__, __float64__, __float80m__, __float80e__, __float128l__, __float128h__

db −0.2     ;"四分之一精度,sign:exponent:mantissa = 1:4:3"
dw −0.5     ;IEEE 754r/SSE5 half precision
dd 1.2         ;an easy one
dd 1.222_222_222     ;underscores are permitted
dd 0x1p+2             ;1.0x2^2 = 4.0
dq 0x1p+32             ;1.0x2^32 = 4 294 967 296.0
dq 1.e10 ; 10 000 000 000.0
dq 1.e+10             ;synonymous with 1.e10
dq 1.e−10             ;0.000 000 000 1
dt 3.141592653589793238462     ;pi
do 1.e+4000                 ;IEEE 754r quad precision


表达式

nasm表达式跟c的表达式很像,$ 代表表达式行的开头,$$ 代表当前段的开头

jmp $  ;死循环
$-$$   ;代表当前到段开头的偏移量
| 或
^ xor
& and
<< >> 无符号左移右移
* multiplication
/ unsigned division
//     signed division
%      unsigned modulo
%%     signed modulo

一元操作符

+  不做任何事
-  负数
~  非
!  逻辑非
seg 




上一篇: nasm与masm与AT&T差异
下一篇: nasm系统调用
作者邮箱: 203328517@qq.com