汇编语言简易教程(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

示例​

image

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

参考

image

分配的数组未初始化为任何特定值.

代码段

初始化数据必须在“section.text”部分中声明

“section”一词后面必须有一个空格。

代码段部分将包含一些定义初始程序入口点的标题或标签。

例如,假设一个基本程序使用标准系统链接器,则必须包含以下声明:

global _start
_start:

终止程序不需要特殊的标签或指令。

然而,应该使用系统服务来通知操作系统应该终止程序并恢复和重新利用资源(例如内存)

示例程序

eg.asm

; 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
posted @ 2024-04-10 12:01  pDJJq  阅读(47)  评论(0编辑  收藏  举报