11章 名称add 128实验
;对功能子程序的测试和验证assume cs:code,ds:data
data segment
db 88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h
db 11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h
data ends
code segment
start : mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8;
call add128
mov ax,4c00h
int 21h
;编写一个子程序,对两个128位数据进行相加。
;名称:add128
;功能:两个128位数据进行相加
;参数:
; ds:si指向存储第一个数的内存空间,因数据为128位,所以需要8个字单元,由低地址单元到高地址单元依次存
; 放128位数据由低到高的各个字。运算结果存储在第一个数的存储空间中。
; ds:di指向存储第二个数的内存空间
add128: push ax
push cx
push si
push di
sub ax,ax ;将CF设置为0
s:mov ax,
adc ax,
mov ,ax
inc si
inc si
inc di
inc di
loop s
pop di
pop si
pop cx
pop ax
ret
code ends
end start
整个代码主要针对字想加不会产生溢出, 8888+1111此时为9999 16位没有溢出, 如果是 FFFF +FFFF,此时16位装不下 也有128位 相加 我们该怎么办?
http://bbs.fishc.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 空手套小白狼的微博 本帖最后由 莫名其妙 于 2012-3-31 13:43 编辑
进位保存在标志寄存器 寄存器保存加法以后的值应该是这样吧 ffff+ffff =1fffe 进位最多进1 保存在标志寄存器中 结果是fffe 而且位数也相同!~
ffff ffff ffff
+ ffff ffff ffff
CF 1 1 1
---+--+-------
fffe fffe fffe
=CF 1 fffffffffffe
这样就出结果了 寄存器里保存数据fffffffffffe CF保存进位 1
加减法只关心CF标志位,进不进位,借不借位.计算过程跟溢出没关系.
如果第1字单元相加进位了,就把下第二个字单元值+1.
直到最后一个字单元相加再进位,就放不下了,这时候进的1就只保存在CF中,最后得数就相当于少了一个最高位的1.
这时,如果想要得数保持准确就多根据数的位数多申请一个空字单元,里面就相当于0+0+1.
如果没有多申请内存空间,那这个答案显然是错的.这个得数就是因为超过了存储范围,溢出后的结果.
页:
[1]