汇编语言简易教程(4):基本语法
汇编语言简易教程(4):基本语法
以yasm语法为主
注释
;
分号之后的所有内容全都是注释, 没有实际作用.数值
数值必须是 10进制 / 16进制 / 八进制
最终都会被转为16进制的数字, 以
0x
开头, 例如127
->0x7f
当使用8进制的时候:
511
->777q
默认基数(基数)为十进制,因此十进制(基数为 10)数字不需要特殊符号
定义常量
表示方法为
<name> equ <value>
例如:
SIZE equ 10000
在组装过程中,常量将替换为其定义的值。
因此,常量没有分配内存位置。
这使得常量更加灵活,因为它没有分配特定的类型/大小(字节、字、双字等)。
这些值受预期用途的范围限制。
数据段
初始化数据必须在“section.data”部分中声明
“section”一词后面必须有一个空格。
所有初始化的变量和常量都放置在段中。
变量名必须以字母开头,后跟字母或数字,包括一些特殊字符(例如下划线、“_”)。
变量定义必须包括变量的名称、数据类型和初始值.
基本格式
<variableName> <dataType> <initialValue>
类型
类型 含义 db
8-bit variable(s) dw
16-bit variable(s) dd
32-bit variable(s) dq
64-bit variable(s) ddq
128-bit variable(s) → integer dt
128-bit variable(s) → float 示例
BSS 段
存储类似实现开辟的数组, 未填充值.
初始化数据必须在“section.bss”部分中声明
“section”一词后面必须有一个空格。
所有初始化的变量和常量都放置在段中。
变量名必须以字母开头,后跟字母或数字,包括一些特殊字符(例如下划线、“_”)。
变量定义必须包括变量的名称、数据类型和初始值.
基本格式
<variableName> <restype> <coudnt>
类型
类型 含义 resb
8-bit variable(s) resw
16-bit variable(s) resd
32-bit variable(s) resq
64-bit variable(s) resdq
128-bit variable(s) → integer 参考
分配的数组未初始化为任何特定值.
代码段
初始化数据必须在“section.text”部分中声明
“section”一词后面必须有一个空格。
代码段部分将包含一些定义初始程序入口点的标题或标签。
例如,假设一个基本程序使用标准系统链接器,则必须包含以下声明:
global _start _start:
终止程序不需要特殊的标签或指令。
然而,应该使用系统服务来通知操作系统应该终止程序并恢复和重新利用资源(例如内存)
示例程序
; Simple example demonstrating basic program format and layout. ; Ed Jorgensen ; July 18, 2014 ; ************************************************************ ; Some basic data declarations section .data EXIT_SUCCESS equ 0 ; successful operation SYS_exit equ 60 ; call code for terminate bVar1 db 17 bVar2 db 9 bResult db 0 wVar1 dw 17000 wVar2 dw 9000 wResult dw 0 dVar1 dd 17000000 dVar2 dd 9000000 dResult dd 0 qVar1 dq 170000000 qVar2 dq 90000000 qResult dq 0 ; Code Section section .text global _start _start: ; Performs a series of very basic addition operations ; to demonstrate basic program format. ; ---------- ; Byte example ; bResult = bVar1 + bVar2 mov al, byte [bVar1] add al, byte [bVar2] mov byte [bResult], al ; ---------- ; Double-word example ; dResult = dVar1 + dVar2 mov eax, dword [dVar1] add eax, dword [dVar2] mov dword [dResult], eax ; ---------- ; Quadword example ; qResult = qVar1 + qVar2 mov rax, qword [qVar1] add rax, qword [qVar2] mov qword [qResult], rax ; ************************************************************ ; Done, terminate program. last: mov rax, SYS_exit ; Call code for exit mov rdi, EXIT_SUCCESS ; Exit program with success syscall