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