无符号数加减乘除

无符号数加法

add

add指令可以改变Flag Register中的ZF,SF,AF,CF,PF,OF位。
下面是一个计算1-100和的程序
global main
extern printf
segment .text
main:
	push ebp
	mov ebp,esp
	
	mov eax,0
	mov edx,0
loop:
	inc dl
	add al,dl
	adc ah,0
	cmp dl,101
	jnz loop
	
	push eax
	push msg
	call printf
	leave
	ret
segment .data
msg: db "The sum of 0-100 is %u",0x0A,0

adc

上面的一段程序用到了adc指令,原因是al是不足以放下sum(1,100)的,adc指令会查看CF标志,并将其加到结果上。即adc,A,B 相当于 A=A+B+CF。这给计算寄存器不能存的下的数据提供了便利。如下面的程序,两个0xFFFFFFFF相加,并显示结果。将进位保存到ebx,然后采用GCC中的long long输出。
global main
extern printf
segment .text
main:
	push ebp
	mov ebp,esp
	mov ebx,0
	clc
start:
	mov eax,[op1]
	add eax,[op2]
	adc ebx,0
	push ebx
	push eax
	push msg
	call printf
	leave
	ret


segment .data
op1: dd 0xFFFFFFFF
op2: dd 0xFFFFFFFF
msg: db 'Result is %llu',0xa,0x0

无符号数减法

sub

无符号减法的执行过程可以描述为
  1. 获取减数的二进制补码
  2. 与被减数相加
  3. 倒转进位
这样以来,执行sub后,若CF=0,结果为正;若CF=1,则结果为负。
下面这段程序计算了 2 sub 3。
global main
extern printf
segment .text
main:
	push ebp
	mov ebp,esp
	
	mov eax,2
	mov ebx,3

	sub eax,ebx
	not eax  
	add eax,1 ;求正数原码 
	push eax
	push msg
	call printf

	leave
	ret

segment .data
msg: db 'Result is -%u',0xa,0x0

sbb

与adc差不多,sbb A,B 相当于 A=A-B-CF。即若有借位则减一。

无符号数乘法

mul

无符号乘法,其中一个隐含操作数在寄存器eax中。结论见下表

类型操作数1操作数二结果
8*8al寄存器/内存ax
16*16ax寄存器/内存dx(高位),ax(低位)
32*32eax寄存器/内存edx(高位),eax(低位)

下面是一个例子:
global main
extern printf

segment .text
main:
	push ebp
	mov ebp,esp
	
	mov eax,0

	mov al,3
	mov bl,4
	mul bl
	
	push eax
	push msg1
	call printf
	
	mov ax,4500
	mov bx,1000
	mul bx
	mov bx,dx
	shl ebx,16
	mov bx,ax
	push ebx
	push msg2
	call printf
	
	mov eax,0xFFFFFFFF
	mov ebx,0xFFFFFFFF
	mul ebx
	
	push edx
	push eax
	push msg3
	call printf

	leave
	ret

segment .data
msg1: db '3*4=%u',0x0a,0x0
msg2: db '4500*1000=%u',0x0a,0x0
msg3: db '0xFFFFFFFF*0xFFFFFFFF=%llu',0x0a,0x0

无符号除法

div

在进行出发时,若分母为0或商对寄存器来说太大,会产生异常。除法类型见下表
类型分子分母余数
8/8al=x,ah=0寄存器/内存alah
16/16ax=x,dx=0寄存器/内存axdx
32/32eax=x,edx=0寄存器/内存eaxedx

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值