2️⃣Variables

Allocating Storage Space for Initialized Data

Syntax để phân bổ bộ nhớ cho dữ liệu được khởi tạo là:

[variable-name]    define-directive    initial-value   [,initial-value]...

Where, variable-name is the identifier for each storage space. The assembler associates an offset value for each variable name defined in the data segment.

Trong đó, variable-name là tên biến (mã định danh) cho mỗi không gian lưu trữ. Nasm liên kết một offset cho mỗi tên biến được xác định trong .data segment.

Có 5 dạng cơ bản để khai tạo kiểu dữ liệu:

Directive
Purpose
Storage Space

DB

Define Byte

allocates 1 byte = 8 bits

DW

Define Word

allocates 2 bytes = 16 bits

DD

Define Doubleword

allocates 4 bytes = 32 bits

DQ

Define Quadword

allocates 8 bytes = 64 bits

DT

Define Ten Bytes

allocates 10 bytes = 80 bits

Ví dụ:

choice		DB	'y'
number		DW	12345
neg_number	DW	-12345
big_number	DQ	123456789
real_number1	DD	1.234
real_number2	DQ	123.456

Lưu ý:

  • Mỗi byte kí tự được lưu trữ dưới dạng giá trị ASCII trong base 16 (hexa)

  • Các giá trị thập phân sẽ tự động chuyển đổi tương đương nhị phân 16 bit và được lưu trữ dưới dạng số thập lục phân.

  • Bộ xử lí sẽ sử dụng little endian.

  • Các số âm sẽ được chuyển đổi sang số bù 2

  • Short và long floating numbers sẽ sử dụng 32 or 64 bits.

Một chương trình ví dụ về khai báo các kiểu dữ liệu

section .text
   global _start         
	
_start:           
   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'

Kết quả:

y

Allocating Storage Space for Uninitialized Data

Tương tự với 5 kiểu khai báo biến trên thì ta cũng có 5 kiểu khai báo dự trữ dự trữ:

Directive
Purpose

RESB

Reserve a Byte

RESW

Reserve a Word

RESD

Reserve a Doubleword

RESQ

Reserve a Quadword

REST

Reserve a Ten Bytes

my_var RESB 4  ; Dự trữ 4 byte cho biến my_var
my_array RESW 10 ; Dự trữ 10 từ (tức là 20 byte) cho mảng my_array

Tương đương với khai báo biến trong C : int number;

Multiple Definitions

Bạn có thể có nhiều câu lệnh định nghĩa dữ liệu trong một chương trình. Ví dụ

choice	  DB 	'Y' 		 ;ASCII of y = 79H
number1	  DW 	12345 	 ;12345D = 3039H
number2    DD  12345679  ;123456789D = 75BCD15H

Trình biên dịch sẽ phân bổ nhiều bộ nhớ liền kề cho nhiều định nghĩa biến

Multiple Initializations

Chỉ định TIMES cho phép nhiều lần khởi tạo với cùng một giá trị. Ví dụ: một mảng có tên là markscó kích thước là 9 được định nghĩa và khởi tạo thành 0 bằng cách sử dụng câu lệnh sau:

marks  TIMES  9  DW  0

Chỉ định TIMES rất hữu ích trong việc xác định mảng và bảng. Chương trình sau đây hiển thị 9 dấu hoa trên màn hình:

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 '*'

Kết quả:

*********

Practice:

Hôm nay mình sẽ không cho bài tập vì các dạng bài khá giống với buổi trước. Bài tập mình sẽ cho khi học đến các instruction toán học: tức là add, sub, mul,... đó

Last updated