空手套小白狼 发表于 2012-3-31 00:05:07

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 09:08:07

本帖最后由 莫名其妙 于 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      


梅梁馨 发表于 2012-3-31 12:01:05

加减法只关心CF标志位,进不进位,借不借位.计算过程跟溢出没关系.
如果第1字单元相加进位了,就把下第二个字单元值+1.
直到最后一个字单元相加再进位,就放不下了,这时候进的1就只保存在CF中,最后得数就相当于少了一个最高位的1.
这时,如果想要得数保持准确就多根据数的位数多申请一个空字单元,里面就相当于0+0+1.
      如果没有多申请内存空间,那这个答案显然是错的.这个得数就是因为超过了存储范围,溢出后的结果.
页: [1]
查看完整版本: 11章 名称add 128实验