nasm 汇编指令 列表

本文介绍了NASM汇编语言中的操作指令、算术指令、字符串指令和程序转移指令,包括移动、比较、加减法、串扫描、加载、保存等操作,并详细列举了各种条件转移和循环控制指令。

操作指令

MOV   dst, src   把src 的内容 复制到 dst中,操作字长由参数字长决定

push    把参数入栈

pop      从栈顶弹出数据,存入给定参数中

PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.(在不同模式下面,对应不同的寄存器,如32bit模式,对应32位寄存器)

POPA    把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. (同上)

cmp   arg1, arg2   比较两个参数的大小(arg1 - arg2), 根据结果修改标志位

xchg   arg1, arg2  交换两个参数的内容


算术指令

add   dst,  src      加法,dst = dst + src

sub   arg1, arg2  减法,arg1 = arg1 - arg2


字符串指令

DS:SI 源串段寄存器 :源串变址.
ES:DI 目标串段寄存器:目标串变址

CX 重复次数计数器.
AL/AX 扫描值

SCASB 串扫描.  把AL的内容与目标串作比较(AL -  [ES:DI]),比较结果反映在标志位.

LODS 装入串. 把源串中的元素(字或字节)逐一装入AL或AX,EAX中. ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )

STOS 保存串.  LODS的逆过程。把AL或AX或EAX中的数据装入目标串中。(STOSB, STOSW, STOSD)

REP 当CX/ECX<>0时重复

REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复

REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.

REPC 当CF=1且CX/ECX<>0时重复.

REPNC 当CF=0且CX/ECX<>0时重复


程序转移指令

1. 无条件转移指令

JMP 无条件转移指令

CALL 过程调用

RET/RETF过程返回.

2. 条件转移指令

JA/JNBE 大于时转移.

JAE/JNB 大于或等于转移.

JB/JNAE 小于转移.

JBE/JNA 小于或等于转移.

以上四条,测试无符号整数运算的结果(标志C和Z).

JG/JNLE 大于转移.

JGE/JNL 大于或等于转移.

JL/JNGE 小于转移.

JLE/JNG 小于或等于转移.

以上四条,测试带符号整数运算的结果(标志S,O和Z).

JE/JZ 等于转移.

JNE/JNZ 不等于时转移.

JC 有进位时转移.

JNC 无进位时转移.

JNO 不溢出时转移.

JNP/JPO 奇偶性为奇数时转移.

JNS 符号位为 "0" 时转移.

JO 溢出转移.

JP/JPE 奇偶性为偶数时转移.

JS 符号位为 "1" 时转移.

3. 循环控制指令(短转移)

LOOP CX不为零时循环.

LOOPE/LOOPZ CX不为零且标志Z=1时循环.

LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.

JCXZ CX为零时转移.

JECXZ ECX为零时转移.

4. 中断指令

INT 中断指令

INTO 溢出中断

IRET 中断返回

处理机控制指令

标志处理指令 CLC(进位位置0指令)

CMC(进位位求反指令)

STC(进位位置为1指令)

CLD(方向标志置1指令)

STD(方向标志位置1指令)

CLI(中断标志置0指令)

STI(中断标志置1指令)

NOP(无操作)

HLT(停机)

WAIT(等待)

ESC(换码)

LOCK(封锁)

目录 前言i 第1章简介1 1.1 数制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.1 十进制. . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.2 二进制. . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.3 十六进制. . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 计算机结构. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.1 内存. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.2 CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.3 CPU 80x86系列. . . . . . . . . . . . . . . . . . . . . 5 1.2.4 8086 16位寄存器. . . . . . . . . . . . . . . . . . . . . 6 1.2.5 80386 32位寄存器. . . . . . . . . . . . . . . . . . . . 7 1.2.6 实模式. . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2.7 16位保护模式. . . . . . . . . . . . . . . . . . . . . . . 8 1.2.8 32位保护模式. . . . . . . . . . . . . . . . . . . . . . . 8 1.2.9 中断. . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3 汇编语言. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3.1 机器语言. . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3.2 汇编语言. . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3.3 指令操作数. . . . . . . . . . . . . . . . . . . . . . . . 10 1.3.4 基本指令. . . . . . . . . . . . . . . . . . . . . . . . . 10 1.3.5 指示符. . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.3.6 输入和输出. . . . . . . . . . . . . . . . . . . . . . . . 14 1.3.7 调试. . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.4 创建一个程序. . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.4.1 第一个程序. . . . . . . . . . . . . . . . . . . . . . . . 16 1.4.2 编译器依赖. . . . . . . . . . . . . . . . . . . . . . . . 18 1.4.3 汇编代码. . . . . . . . . . . . . . . . . . . . . . . . . 19 1.4.4 编译C代码. . . . . . . . . . . . . . . . . . . . . . . . 19 1.4.5 连接目标文件. . . . . . . . . . . . . . . . . . . . . . . 20 1.4.6 理解一个汇编列表文件. . . . . . . . . . . . . . . . . . 20 3 4 目录 1.5 骨架文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 第2章基本汇编语言23 2.1 整形工作方式. . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.1.1 整形表示法. . . . . . . . . . . . . . . . . . . . . . . . 23 2.1.2 正负号延伸. . . . . . . . . . . . . . . . . . . . . . . . 25 2.1.3 补码运算. . . . . . . . . . . . . . . . . . . . . . . . . 28 2.1.4 程序例子. . . . . . . . . . . . . . . . . . . . . . . . . 29 2.1.5 扩充精度运算. . . . . . . . . . . . . . . . . . . . . . . 31 2.2 控制结构. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.2.1 比较. . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.2.2 分支指令. . . . . . . . . . . . . . . . . . . . . . . . . 33 2.2.3 循环指令. . . . . . . . . . . . . . . . . . . . . . . . . 36 2.3 翻译标准的控制结构. . . . . . . . . . . . . . . . . . . . . . . 36 2.3.1 If语句. . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.3.2 While循环. . . . . . . . . . . . . . . . . . . . . . . . . 37 2.3.3 Do while循环. . . . . . . . . . . . . . . . . . . . . . . 37 2.4 例子:查找素数. . . . . . . . . . . . . . . . . . . . . . . . . . . 37 第3章位操作41 3.1 移位操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.1.1 逻辑移位. . . . . . . . . . . . . . . . . . . . . . . . . 41 3.1.2 移位的应用. . . . . . . . . . . . . . . . . . . . . . . . 42 3.1.3 算术移位. . . . . . . . . . . . . . . . . . . . . . . . . 42 3.1.4 循环移位. . . . . . . . . . . . . . . . . . . . . . . . . 42 3.1.5 简单应用. . . . . . . . . . . . . . . . . . . . . . . . . 43 3.2 布尔型按位运算. . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.2.1 AND运算符. . . . . . . . . . . . . . . . . . . . . . . . 44 3.2.2 OR运算符. . . . . . . . . . . . . . . . . . . . . . . . . 44 3.2.3 XOR运算. . . . . . . . . . . . . . . . . . . . . . . . . 44 3.2.4 NOT运算. . . . . . . . . . . . . . . . . . . . . . . . . 45 3.2.5 TEST指令. . . . . . . . . . . . . . . . . . . . . . . . . 45 3.2.6 位操作的应用. . . . . . . . . . . . . . . . . . . . . . . 45 3.3 避免使用条件分支. . . . . . . . . . . . . . . . . . . . . . . . 47 3.4 在C中进行位操作. . . . . . . . . . . . . . . . . . . . . . . . . 49 3.4.1 C中的按位运算. . . . . . . . . . . . . . . . . . . . . . 49 3.4.2 在C中使用按位运算. . . . . . . . . . . . . . . . . . . 50 3.5 Big和Little Endian表示法. . . . . . . . . . . . . . . . . . . . 51 3.5.1 什么时候需要在乎Little和Big Endian . . . . . . . . . 52 3.6 计算位数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.6.1 方法一. . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.6.2 方法二. . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.6.3 方法三. . . . . . . . . . . . . . . . . . . . . . . . . . . 55 目录5 第4章子程序57 4.1 间接寻址. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.2 子程序的简单例子. . . . . . . . . . . . . . . . . . . . . . . . 57 4.3 堆栈. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.4 CALL和RET指令. . . . . . . . . . . . . . . . . . . . . . . . . 60 4.5 调用约定. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.5.1 在堆栈上传递参数. . . . . . . . . . . . . . . . . . . . 62 4.5.2 堆栈上的局部变量. . . . . . . . . . . . . . . . . . . . 66 4.6 多模块程序. . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.7 C与汇编的接口技术. . . . . . . . . . . . . . . . . . . . . . . 71 4.7.1 保存寄存器. . . . . . . . . . . . . . . . . . . . . . . . 71 4.7.2 函数名. . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.7.3 传递参数. . . . . . . . . . . . . . . . . . . . . . . . . 72 4.7.4 计算局部变量的地址. . . . . . . . . . . . . . . . . . . 73 4.7.5 返回值. . . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.7.6 其它调用约定. . . . . . . . . . . . . . . . . . . . . . . 73 4.7.7 样例. . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 4.7.8 在汇编程序中调用C函数. . . . . . . . . . . . . . . . . 78 4.8 可重入和递归子程序. . . . . . . . . . . . . . . . . . . . . . . 78 4.8.1 递归子程序. . . . . . . . . . . . . . . . . . . . . . . . 79 4.8.2 回顾一下C变量的储存类型. . . . . . . . . . . . . . . 79 第5章数组83 5.1 介绍. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5.1.1 定义数组. . . . . . . . . . . . . . . . . . . . . . . . . 83 5.1.2 访问数组中的元素. . . . . . . . . . . . . . . . . . . . 84 5.1.3 更高级的间接寻址. . . . . . . . . . . . . . . . . . . . 86 5.1.4 例子. . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 5.1.5 多维数组. . . . . . . . . . . . . . . . . . . . . . . . . 91 5.2 数组/串处理指令. . . . . . . . . . . . . . . . . . . . . . . . . 93 5.2.1 读写内存. . . . . . . . . . . . . . . . . . . . . . . . . 94 5.2.2 REP前缀指令. . . . . . . . . . . . . . . . . . . . . . . 95 5.2.3 串比较指令. . . . . . . . . . . . . . . . . . . . . . . . 96 5.2.4 REPx前缀指令. . . . . . . . . . . . . . . . . . . . . . . 96 5.2.5 样例. . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 第6章浮点103 6.1 浮点表示法. . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 6.1.1 非整形的二进制数. . . . . . . . . . . . . . . . . . . . 103 6.1.2 IEEE浮点表示法. . . . . . . . . . . . . . . . . . . . . 105 6.2 浮点运算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 6.2.1 加法. . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 6.2.2 减法. . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 6 目录 6.2.3 乘法和除法. . . . . . . . . . . . . . . . . . . . . . . . 109 6.2.4 分支程序设计. . . . . . . . . . . . . . . . . . . . . . . 109 6.3 数字协处理器. . . . . . . . . . . . . . . . . . . . . . . . . . . 109 6.3.1 硬件. . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 6.3.2 指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 6.3.3 样例. . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 6.3.4 二次方程求根公式. . . . . . . . . . . . . . . . . . . . 115 6.3.5 从文件中读数组. . . . . . . . . . . . . . . . . . . . . 118 6.3.6 查找素数. . . . . . . . . . . . . . . . . . . . . . . . . 120 第7章结构体与C++ 127 7.1 结构体. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 7.1.1 简介. . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 7.1.2 内存地址对齐. . . . . . . . . . . . . . . . . . . . . . . 128 7.1.3 位域s . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 7.1.4 在汇编语言中使用结构体. . . . . . . . . . . . . . . . 132 7.2 汇编语言和C++ . . . . . . . . . . . . . . . . . . . . . . . . . 134 7.2.1 重载函数和名字改编. . . . . . . . . . . . . . . . . . . 134 7.2.2 引用. . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 7.2.3 内联函数. . . . . . . . . . . . . . . . . . . . . . . . . 137 7.2.4 类. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 7.2.5 继承和多态. . . . . . . . . . . . . . . . . . . . . . . . 147 7.2.6 C++的其它特性. . . . . . . . . . . . . . . . . . . . . 153 附录A 80x86指令155 A.1 非浮点指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 A.2 浮点数指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 索引163
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值