简单总结一下汇编语言的语法和知识点,详情参考汇编语言教程

汇编语言语法与知识点总结

一、汇编语言概述

  • 定义:汇编语言是一种低级编程语言,介于机器语言和高级语言之间,使用助记符表示机器指令。
  • 特点
    • 与硬件紧密结合,执行效率高。
    • 针对特定的处理器架构,可移植性差。
    • 编写和调试难度较大,但运行效率高。

二、基本语法结构

(一)指令格式

1
[label:] 指令助记符 操作数1, 操作数2
  • 标签(Label):可选,用于标记代码位置,便于跳转。
  • 指令助记符(Mnemonic):表示操作类型,如 MOVADD 等。
  • 操作数(Operand):指令的操作对象,可以是寄存器、内存地址或立即数。

(二)注释

1
; 这是注释内容
  • 注释从分号 ; 开始,到行尾结束,用于说明代码功能。

三、指令分类

(一)数据传送指令

  • MOV:数据传送指令,用于寄存器和内存之间的数据移动。
    1
    2
    MOV AX, BX       ; 将 BX 寄存器的内容传送到 AX 寄存器
    MOV CX, [SI] ; 将内存地址 [SI] 中的内容传送到 CX 寄存器

(二)算术运算指令

  • ADD:加法指令。
    1
    ADD AX, BX       ; AX = AX + BX
  • SUB:减法指令。
    1
    SUB AX, BX       ; AX = AX - BX
  • MUL:乘法指令。
    1
    MUL BX           ; AX = AX * BX(结果存于 DX:AX 中)
  • DIV:除法指令。
    1
    DIV BX           ; AX / BX,商存于 AX,余数存于 DX

(三)逻辑运算指令

  • AND:按位与。
    1
    AND AX, 0FFh     ; AX = AX & 0FFh
  • OR:按位或。
    1
    OR AX, 0FFh      ; AX = AX | 0FFh
  • XOR:按位异或。
    1
    XOR AX, AX       ; AX = AX ^ AX(清零 AX)
  • NOT:按位取反。
    1
    NOT AX           ; AX = ~AX

(四)控制转移指令

  • JMP:无条件跳转。
    1
    JMP label        ; 跳转到标签 label
  • 条件跳转指令:根据标志寄存器的状态进行跳转。
    • JZ/JE:零标志(ZF)为 1 时跳转。
      1
      JZ label       ; 如果 ZF=1,跳转到 label
    • JNZ/JNE:零标志(ZF)为 0 时跳转。
      1
      JNZ label      ; 如果 ZF=0,跳转到 label
    • JG/JNLE:大于(SF=0 且 ZF=0)时跳转。
      1
      JG label       ; 如果 SF=0 且 ZF=0,跳转到 label

(五)程序调用与返回

  • CALL:调用子程序。
    1
    CALL subroutine  ; 调用子程序 subroutine
  • RET:从子程序返回。
    1
    RET              ; 返回到调用点

四、寄存器

(一)通用寄存器

  • AX:累加器,用于算术运算和数据传送。
  • BX:基址寄存器,用于存储内存地址。
  • CX:计数寄存器,用于循环计数。
  • DX:数据寄存器,用于存储 I/O 操作的数据。

(二)段寄存器

  • CS:代码段寄存器。
  • DS:数据段寄存器。
  • SS:堆栈段寄存器。
  • ES:附加段寄存器。

(三)其他寄存器

  • IP:指令指针,指向当前指令的地址。
  • FLAGS:状态标志寄存器,存储程序运行状态(如 ZF、CF、SF 等)。

五、伪指令

(一)数据定义伪指令

  • DB:定义字节。
    1
    data1 DB 0x12    ; 定义一个字节数据 0x12
  • DW:定义字。
    1
    data2 DW 0x1234  ; 定义一个字数据 0x1234
  • DD:定义双字。
    1
    data3 DD 0x12345678 ; 定义一个双字数据 0x12345678

(二)段定义伪指令

  • SEGMENT:定义段。
    1
    2
    3
    DATA SEGMENT
    data1 DB 0x12
    DATA ENDS

(三)程序控制伪指令

  • START:程序入口点。
  • END:程序结束。
    1
    END             ; 程序结束

六、汇编程序的基本结构

(一)代码段

1
2
3
4
5
6
CODE SEGMENT
START:
MOV AX, 0x1234
MOV BX, AX
...
CODE ENDS

(二)数据段

1
2
3
4
DATA SEGMENT
data1 DB 0x12
data2 DW 0x3456
DATA ENDS

(三)堆栈段

1
2
3
STACK SEGMENT
DW 256 DUP(?) ; 分配 256 字的堆栈空间
STACK ENDS

七、示例程序

(一)简单加法程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA SEGMENT
num1 DB 0x12
num2 DB 0x34
result DB ?
DATA ENDS

CODE SEGMENT
START:
MOV AL, num1
ADD AL, num2
MOV result, AL
...
CODE ENDS
END START

(二)循环程序

1
2
3
4
5
6
7
8
9
10
11
12
13
DATA SEGMENT
count DB 10
DATA ENDS

CODE SEGMENT
START:
MOV CX, count
loop_start:
; 循环体
LOOP loop_start
...
CODE ENDS
END START

八、常用函数与系统调用

(一)Linux 系统调用

在 Linux 中,系统调用通过中断 0x80syscall 指令实现。常见的系统调用包括:

  • write:写入数据到文件描述符。

    1
    2
    3
    4
    5
    MOV EAX, 4      ; 系统调用号 4 表示 write
    MOV EBX, 1 ; 文件描述符 1 表示标准输出
    MOV ECX, message ; 数据地址
    MOV EDX, length ; 数据长度
    INT 0x80 ; 触发中断
  • read:从文件描述符读取数据。

    1
    2
    3
    4
    5
    MOV EAX, 3      ; 系统调用号 3 表示 read
    MOV EBX, 0 ; 文件描述符 0 表示标准输入
    MOV ECX, buffer ; 缓冲区地址
    MOV EDX, 256 ; 缓冲区大小
    INT 0x80 ; 触发中断
  • exit:退出程序。

    1
    2
    3
    MOV EAX, 1      ; 系统调用号 1 表示 exit
    MOV EBX, 0 ; 返回值
    INT 0x80 ; 触发中断

(二)函数调用约定

在函数调用中,参数传递和返回值的处理遵循一定的规则:

  • 参数传递:在 x86 架构中,参数通常通过栈传递。调用函数前,将参数依次压入栈中(从右到左),然后调用函数。

    1
    2
    3
    PUSH param2
    PUSH param1
    CALL function
  • 返回值:函数的返回值通常存储在寄存器中。在 x86 中,整数返回值存储在 EAX 寄存器。

(三)常见库函数

  • printf:格式化输出函数。

    1
    2
    3
    4
    PUSH param2
    PUSH param1
    CALL printf
    ADD ESP, 8 ; 清理栈空间
  • scanf:格式化输入函数。

    1
    2
    3
    PUSH format
    CALL scanf
    ADD ESP, 4 ; 清理栈空间

九、汇编语言在 Pwn 中的应用

(一)漏洞分析

汇编语言在分析二进制程序漏洞时至关重要。通过反汇编程序,可以查看函数实现、数据结构和控制流,发现潜在的漏洞点,如缓冲区溢出、格式化字符串漏洞等。

(二)构造 Payload

在利用漏洞时,常常需要构造特定的 payload。汇编语言可以帮助理解如何构建恶意输入,例如覆盖返回地址、注入 shellcode 等。

(三)调试与测试

使用调试工具(如 gdb)结合汇编知识,可以单步跟踪程序执行,查看寄存器和内存状态,验证漏洞利用的有效性。