Assembly 數字

數值數據普遍表示二進制系統。算術指令的操作上的二進制數據。當數字顯示在屏幕上,或從鍵盤輸入,它們是ASCII形式。

到目前爲止,我們已經轉換成ASCII形式輸入數據進行算術運算的二進制結果轉換回二進制。下面的代碼顯示:

section .text global _start ;must be declared for using gcc
_start: ;tell linker entry yiibai
mov eax,'3' sub eax, '0' mov ebx, '4' sub ebx, '0' add eax, ebx
add eax, '0' mov [sum], eax
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel
mov ecx,sum
mov edx, 1 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
msg db "The sum is:", 0xA,0xD len equ $ - msg
segment .bss
sum resb 1

上面的代碼編譯和執行時,它會產生以下結果:

The sum is:
7

然而,這樣的轉換是有一個系統開銷和彙編語言的程序設計允許更有效的方式,處理數字的二進制形式。十進制數可以表示爲兩種形式:

  • ASCII形式

  • BCD或二進制編碼的十進制形式

ASCII表示

在ASCII碼錶示,十進制數字存儲ASCII字符串。例如,十進制值1234被存儲爲:

31 32 33 34H

其中,31H,32H是ASCII值1 ASCII值2,依此類推。有以下四個指令處理數字的ASCII表示:

  • AAA - ASCII Adjust After Addition

  • AAS - ASCII Adjust After Subtraction

  • AAM - ASCII Adjust After Multiplication

  • AAD - ASCII Adjust Before Division

這些指令不採取任何操作數,並承擔所需的操作數是在AL寄存器中。

下面的示例使用AAS指令來說明這個概念:

section .text global _start ;must be declared for using gcc
_start: ;tell linker entry yiibai sub ah, ah
mov al, '9' sub al, '3' aas or al, 30h mov [res], ax

mov    edx,len ;message length
mov    ecx,msg ;message to write
mov    ebx,1 ;file descriptor (stdout) mov    eax,4 ;system call number (sys\_write) int 0x80 ;call kernel

mov    edx,1 ;message length
mov    ecx,res ;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
msg db 'The Result is:',0xa len equ $ - msg
section .bss
res resb 1

上面的代碼編譯和執行時,它會產生以下結果:

The Result is:
6

BCD 表示

BCD表示有兩種類型:

  • 未打包BCD表示BCD表示

  • 壓縮BCD表示

在壓縮BCD表示,每個字節的存儲的二進制相當於十進制數字。例如,被存儲爲數字1234:

01 02 03 04H

有兩種處理這些數字指令:

  • AAM - 乘法後ASCII調整

  • AAD - ASCII除法前調整

四個ASCII調整指令,AAA,AAS,AAM和AAD也可以用壓縮BCD表示。壓縮BCD碼錶示,每個使用四位數字存儲。兩位十進制數被打包成一個字節。例如,被存儲爲數字1234:

12 34H

有兩種處理這些數字指令:

  • DAA - Decimal Adjust After Addition

  • DAS - decimal Adjust After Subtraction

乘法和除法包裝BCD表示不支持。

例子:

下面的程序增加了兩個5位數的十進制數和顯示的總和。它使用上述的概念:

section .text global _start ;must be declared for using gcc

_start: ;tell linker entry yiibai

mov     esi, 4 ;yiibaiing to the rightmost digit
mov     ecx, 5 ;num of digits
clc

add_loop: mov al, [num1 + esi] adc al, [num2 + esi] aaa
pushf or al, 30h popf
mov [sum + esi], al
dec esi
loop add_loop
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel

mov    edx,5 ;message length
mov    ecx,sum ;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
msg db 'The Sum is:',0xa len equ $ - msg
num1 db '12345' num2 db '23456' sum db ' '

上面的代碼編譯和執行時,它會產生以下結果:

The Sum is:
35801