彙編 - 變數
NASM 提供了各種定義指令來預留變數的儲存空間。定義彙編指令用於分配儲存空間。它可以用來預留和初始化一個或多個位元組。
為已初始化資料分配儲存空間
已初始化資料的儲存分配語句語法如下:
[variable-name] define-directive initial-value [,initial-value]...
其中,變數名是每個儲存空間的識別符號。彙編程式為資料段中定義的每個變數名關聯一個偏移值。
定義指令有五種基本形式:
| 指令 | 用途 | 儲存空間 |
|---|---|---|
| DB | 定義位元組 | 分配 1 位元組 |
| DW | 定義字 | 分配 2 位元組 |
| DD | 定義雙字 | 分配 4 位元組 |
| DQ | 定義四字 | 分配 8 位元組 |
| DT | 定義十位元組 | 分配 10 位元組 |
以下是一些使用定義指令的示例:
choice DB 'y' number DW 12345 neg_number DW -12345 big_number DQ 123456789 real_number1 DD 1.234 real_number2 DQ 123.456
請注意:
每個字元位元組都以其十六進位制 ASCII 值儲存。
每個十進位制值都會自動轉換為其 16 位二進位制等效值並存儲為十六進位制數。
處理器使用小端位元組序。
負數轉換為其二進位制補碼錶示。
短浮點數和長浮點數分別使用 32 位或 64 位表示。
以下程式顯示了定義指令的使用:
section .text global _start ;must be declared for linker (gcc) _start: ;tell linker entry point mov edx,1 ;message length mov ecx,choice ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data choice DB 'y'
編譯並執行上述程式碼後,會產生以下結果:
y
為未初始化資料分配儲存空間
保留指令用於預留未初始化資料的空間。保留指令採用單個運算元,該運算元指定要預留的空間單位數。每個定義指令都有一個相關的保留指令。
保留指令有五種基本形式:
| 指令 | 用途 |
|---|---|
| RESB | 保留一個位元組 |
| RESW | 保留一個字 |
| RESD | 保留一個雙字 |
| RESQ | 保留一個四字 |
| REST | 保留十個位元組 |
多個定義
程式中可以有多個數據定義語句。例如:
choice DB 'Y' ;ASCII of y = 79H number1 DW 12345 ;12345D = 3039H number2 DD 12345679 ;123456789D = 75BCD15H
彙編程式為多個變數定義分配連續記憶體。
多次初始化
TIMES 指令允許對同一值進行多次初始化。例如,可以使用以下語句定義名為 marks 的大小為 9 的陣列並將其初始化為零:
marks TIMES 9 DW 0
TIMES 指令在定義陣列和表格時很有用。以下程式在螢幕上顯示 9 個星號:
section .text global _start ;must be declared for linker (ld) _start: ;tell linker entry point mov edx,9 ;message length mov ecx, stars ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data stars times 9 db '*'
編譯並執行上述程式碼後,會產生以下結果:
*********
廣告