nasm汇编之数值 Numbers
数值数据通常用二进制表示。算术指令对二进制数据进行操作。当数字显示在屏幕上或通过键盘输入时,它们为ASCII格式
此类转换会产生开销,并且汇编语言编程允许以更有效的方式以二进制形式处理数字。小数可以两种形式表示
- ASCII格式
- BCD或者二进制编码的十进制形式
ASCII表示
在ASCII表示中,十进制数字存储为ASCII字符串
有四条指令以ASCII表示形式处理数字
- AAA ASCII Adjust After Addition
- AAS ASCII Adjust After Subtraction
- AAM ASCII Adjust After Multiplication
- AAD ASCII Adjust Before Division
这些指令不使用任何操作数,并假定所需的操作数位于AL寄存器中
示例
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
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
BCD表示
有两种BCD表示
- 开箱BCD
- 封箱BCD
在未压缩的BCD表示形式中,每个字节都存储一个十进制数字的二进制等效项.
有两条指令处理数字
- AAM ASCII Adjust After Multiplication
- AAD ASCII Adjust Before Division
四个ASCII调整指令AAA,AAS,AAM和AAD也可以与未打包的BCD表示一起使用。在打包的BCD表示中,每个数字使用四位存储。 两个十进制数字打包成一个字节。
有两个处理这些数字的说明
- DAA Decimal Adjust After Addition
- DAS decimal Adjust After Subtraction
打包的BCD表示形式不支持乘法和除法
示例
Live Demo
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov esi, 4 ;pointing 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 ' '