nasm 汇编指令 列表

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
<think>好的,我现在需要回答用户关于NASM汇编语言指令大全文档链接的请求。首先,我得确认用户需要的是NASM的指令列表还是官方文档。NASM作为一款流行的汇编器,其官方文档应该包含所有指令和用法的详细信息。 用户可能希望得到一个可以直接访问的链接,所以我要先找到NASM的官方文档链接。记得NASM的官方网站是nasm.us,那里应该提供最新的文档。不过,有时候文档可能托管在其他地方,比如GitHub或者官方手册的PDF版本。 接下来,我需要确保链接的有效性。NASM的官方文档通常以HTML和PDF形式存在。比如,https://nasm.us/doc/nasmdoc.html 是HTML版的官方手册,而PDF版本可能也在同一位置。需要确认这个链接是否仍然可用,避免用户点击时出现404错误。 另外,用户提到“指令大全”,可能是指所有汇编指令列表,比如x86指令集。但NASM本身支持的指令取决于目标架构,比如x86、x64等。NASM的文档会涵盖它支持的汇编语法和伪指令,而具体的CPU指令可能需要参考Intel或AMD的手册。这时候可能需要区分清楚,NASM的文档主要讲解如何正确使用汇编器和其支持的伪指令,而具体的机器指令如MOV、ADD等属于处理器架构的内容。 用户可能需要的是NASM支持的伪指令和汇编器指令,比如section、db、equ等,以及宏处理指令。这些在官方文档中都有详细说明。因此,在回答中应该明确说明NASM文档涵盖的内容,并建议用户参考处理器手册获取完整的指令集。 另外,用户可能对中文资源有需求,但NASM的官方文档是英文的。如果需要中文资料,可能需要推荐一些翻译版本或第三方教程,但不确定是否存在权威的中文文档。这种情况下,应优先提供官方链接,并说明语言情况,避免提供不可靠的中文链接。 总结一下,回答应包括以下几点: 1. NASM官方文档链接(HTML和PDF)。 2. 说明文档内容,包括伪指令、汇编器用法等。 3. 区分NASM文档与处理器指令集手册的不同。 4. 提及中文资源的可能性,但强调官方文档的权威性。 5. 可能补充如何查找指令的具体例子,比如在文档中搜索特定指令。 需要检查是否有其他资源,比如NASM的官方GitHub仓库是否有文档,或者是否有社区维护的指令列表。但一般来说,官方手册是最全面的,因此应作为主要推荐。 最后,确保回答结构清晰,分点说明,帮助用户逐步找到所需信息,并强调正确使用LaTeX格式,但用户的问题不涉及数学公式,所以可能不需要使用。不过根据系统级指令,若涉及任何行内代码或术语,可能需要用反引号或其他格式,但用户可见层没有特别要求。保持回答简洁有用即可。</think>NASM(Netwide Assembler)是一款广泛使用的开源汇编器,支持x86和x64架构。以下是关于其文档和指令的详细介绍: --- ### **1. NASM官方文档链接** - **HTML版手册**:[NASM Official Documentation](https://nasm.us/doc/nasmdoc.html) 包含完整的语法说明、伪指令、宏用法及示例。 - **PDF版手册**:[NASM Manual (PDF)](https://nasm.us/docs.php) 可在官网下载最新版本的PDF手册。 --- ### **2. NASM文档核心内容** 官方文档涵盖以下关键内容: - **汇编器指令(伪指令)**:如 `section`, `db`, `dw`, `equ`, `times`, `%include` 等。 - **宏系统**:`%macro`, `%endmacro`, 参数引用(`%1`, `%2`)等。 - **符号与标签**:局部标签(`.label`)、全局符号(`global`)的定义。 - **目标格式支持**:如 `-f bin`(纯二进制)、`-f elf`(Linux ELF)、`-f win32`(Windows)等。 - **调试与优化**:调试信息生成(`-g`)、代码优化建议。 --- ### **3. 汇编指令与处理器指令集的区分** - **NASM伪指令**:由汇编器处理的命令(如分配内存、定义常量)。 - **CPU指令**:如 `mov`, `add`, `jmp` 等,属于x86/x64指令集,需参考处理器手册: - Intel手册:[Intel® 64 and IA-32 Architectures Developer Manuals](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html) - AMD手册:[AMD64 Architecture Programmer’s Manual](https://www.amd.com/en/support/tech-docs) --- ### **4. 中文资源建议** - **官方文档无中文版**,但可通过浏览器翻译工具辅助阅读。 - **第三方教程**:部分中文社区(如博客、GitHub)有NASM基础教程,但需谨慎验证准确性。 --- ### **5. 常用指令示例** ```nasm section .data msg db 'Hello, World!', 0xA ; 定义字符串 len equ $ - msg ; 计算字符串长度 section .text global _start _start: mov eax, 4 ; sys_write系统调用 mov ebx, 1 ; 标准输出 mov ecx, msg ; 字符串地址 mov edx, len ; 字符串长度 int 0x80 ; 调用内核 mov eax, 1 ; sys_exit系统调用 int 0x80 ``` --- ### **6. 进一步学习建议** 1. 通读官方文档第3章(NASM语法)和第4章(伪指令)。 2. 结合实例代码实践,如操作系统开发或嵌入式编程项目。 3. 使用调试工具(如GDB)观察指令执行效果。 如需具体指令的详细解释,可在官方文档中按章节搜索关键字(如“`resb`”或“`%macro`”)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值