Skip to content

Latest commit

 

History

History
170 lines (111 loc) · 3.35 KB

File metadata and controls

170 lines (111 loc) · 3.35 KB

第25节 带进(借)位的加减法

❤️💕💕汇编语言目前仍在发挥着不可替代的作用,在效率上无可替代,在底层,学习linux内核,计算机外围设备和驱动,都离不开汇编。Myblog:http://nsddd.top


[TOC]

adc - 带进位加法指令

adc是带进位加法指令,它利用了CF位上记录的进位值。

指令格式

adc 操作对象1, 操作对象2

功能

操作对象1 = 操作对象1 + 操作对象2 + CF

比如

adc ax, bx
(ax) = (ax) + (bx) + CF

mov ax, 2
mov bx, 1
sub bx, ax ; bx 获得bx - ax ;向高位借位CF = 1,
adc ax, 1

执行后,(ax)= 4。adc执行时,相当于计算:(ax) + 1 + CF = 2 + 1 + 1 = 4。

这个借位是上面减法的进位

mov ax, 1
add ax, ax //没有产生进位CF = 0
adc ax, 3

执行后,(ax)= 5。adc执行时,相当于计算:(ax) + 3 + CF = 2 + 2 + 0 = 5。

mov al, 98H
mov al, al //进位,al不存不下,为30H
adc al, 3

执行后,(al)= 34H。adc执行时,相当于计算:(al) + 3 + CF = 30H + 3 + 1 = 34H

adc指令应用:大数相加

可以看出adc指令比add指令多加了一个CF位的值。

8086提供add指令,完成8位或16位相加,但是更大的数相加?

在执行adc指令的时候加上CF的值的含义,是由adc指令前面的指令决定的,也就是说,关键在于所加上的CF值是被什么指令设置的。如果CF的值是被sub指令设置的,那么它的含义就是借位值;如果是被add指令设置的,那么它的含义就是进位值。

	  01   98
	
	+ 01   83
	     1
	------------
	  03   1B

加法分两步进行:

1)低位相加;

2)高位相加再加上低位相加产生的进位值。

用法:

add al, bl  ;低位相加,cf保存进位值
adc ah, bh  ;如果进位加上进位的值。

CPU提供adc指令的目的,就是来进行加法的第二步运算的。adc指令和add指令相配合就可以对更大的数据进行加法运算。

例:计算1EF000H + 201000H,结果放在ax(高16位)和xb(低16位)中。

mov ax, 001EH
mov bx, 0F000H
add bx, 1000H
adc ax, 0020H

计算1EF0001000H + 2010001EF0H,结果放在ax(最高16位),bx(次高16位),cx(低16位)

mov cx, 1000H
mov bx, 0F000H
mov ax, 001EH
add cx, 1EF0H
adc bx, 1000H
adc ax, 0020H

sbb 指令

sbb是带借位减法指令,它利用了CF位上记录的借位值。

指令格式

sbb 操作对象1, 操作对象2

功能

操作对象1 = 操作对象1 - 操作对象2 - CF

比如

sbb ax, bx

(ax) = (ax) - (bx) - CF

sbb指令执行后,将对CF进行设置。利用sbb指令可以对任意大的数据进行减法运算。

:003E1000H - 00202000H,结果放在ax, bx

mov bx, 1000H
mov ax, 003EH
sub bx, 2000H
sbb ax, 0020H

sbb和adc是基于同样的思想设计的两条指令。

END 链接