NASM 常用语法点

2020-01-20 00:29:44   最后更新: 2020-01-26 12:52:47   访问数量:270




本文介绍一些 NASM 汇编语言的常用语法点,仅供参考

 

 

00000000 00000000 00000000 00000000

|===============EAX===============| -- 32 个 0,4 个字节,2 个字

|======AX=======| -- 16 个 0,2 个字节,1 个字

|===AH==|==AL===|

AH 是 AX 的高 8 位,AL 是 AX 的低 8 位,AX 是 EAX 的低 16 位

 

通过 [SECTION xxx] 来定义一个内存段,xxx 就是内存段名称,用户可以自定义

对于同名的 SECTION,在编译后会被放到同一块连续内存上

NASM 预定义了 .data、.text 和 .bss SECTION,编译后 .text 段会被放到 .data 前,用户自定义 SECTION 则会被放到 .data 之后

每个 SECTION 都是按照 4 字节对齐的

[SECTION .data] var1 db 0x01

 

 

  • in al,92h 表示从92h号端口读入一个字节
  • out 92h,al 表示向92h号端口写入一个字节

 

格式

%macro 宏名 参数名列表 宏体 %endmacro

 

 

示例

%macro Descriptor 3 dw %2 & 0FFFFh dw %1 & 0FFFFh db (%1 >> 16) & 0FFh dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) db (%1 >> 24) & 0FFh %endmacro ; 共 8 字节

 

 

这个宏定义了操作系统中描述符的格式,宏名为:Descriptor

使用时只需定义:

Descriptor 参数1, 参数2, 参数3

 

 

其中宏定义中的%1代表参数1,%2代表参数2,%3代表参数3

 

将由源变址寄存器 DS:E(SI) 寻址的一个内存指向的存储器操作数 OPS 装入到累加器 AL/AX/EAX 中,为下次传送作准备,并根据DF的值自动修改地址

当方向标志位 D=0 时,则SI自动增加;D=1时,SI自动减小

LODSB/LODSW/LODSD 是没有操作数的字符串装入指令,装入的分别是字节,字 ,双字.

 

逻辑运算指令 test 执行 BIT 与 BIT 之间的测试运算

Test 对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存

TEST AX,BX 与 AND AX,BX 命令有相同效果

Test的一个非常普遍的用法是用来测试一方寄存器是否为空:

例如:

test ecx, ecx jz somewhere

 

 

如果ecx为零,设置 ZF 零标志为 1,Jz 跳转

 

MOVZX 是汇编语言数据传送指令 MOV 的变体

无符号扩展并传送

movzx 其实就是将源操作数取出来,然后设置为目的操作数,目的操作数的其余位用 0 填充

 

例如,eax=00304000h

执行 movzx eax, ax 后 eax = 00004000h

执行 movzx eax, ah 后 eax = 00000030h

 

stosb,stosw,stosd 这三个指令把 al、ax、eax 的内容存储到 es:edi 指向的内存单元中

同时 edi 的值根据方向标志的值增加或者减少

 

JC(Jump if Carry)

当运算产生进位标志时,即 CF=1 时,跳转到目标程序处

=======================================================================

==相同的指令还有:

==JNC,当CF=0时跳转;

==JZ,当ZF=1时跳转,

==JNZ,当ZF=0时跳转;

==JO,当OF=1时跳转,

==JNO,当OF=0时跳转;

==JP,当PF=1时跳转……

==依此类推,标志寄存器的各个位基本上都可以用来做“条件跳转”的条件。

==用于大小判断型的:

==  cmp op1,op2

==  JXX Label

== 其中JXX有以下几种:

==JA表示op1>op2,JNA表示op1<=op2;

==JB表示op1<op2,JNB表示op1>=op2;

==JE表示op1=op2,JNE表示op1<>op2;

==还有JAE、JNAE、JBE、JNBE等等功能重复不再赘述。

==以上是无符号数的比较。

==有符号数的比较将A换成G,将B换成L即可。

==A=above B=below G=greater L=less

======================================================================

 

 

  • ret -- 弹出 1 个参数,给 ip ,返回
  • retf -- 弹出 2 个参数,一个给 ip,一个给 cs,返回
  • iref -- 弹出 3 个参数,一个给 ip,一个 给 cs,一个给 flag 标志位,返回

 

欢迎关注微信公众号,以技术为主,涉及历史、人文等多领域的学习与感悟,每周三到七篇推文,只有全部原创,只有干货没有鸡汤

 

 

https://www.nasm.us/

 






操作系统      nasm      asm      汇编语言      寄存器     


京ICP备15018585号