注册 登录
编程论坛 汇编论坛

带进位ADC指令的问题

Agdmeg 发布于 2012-08-10 18:13, 3807 次点击
自己写了个简单的4字节加法程序,从运行结果看,用了ADC,但电脑没有把进位加进去.
45218763H+62578453H应该等于A7790BB6吧,但运行结果是A7780BB6,汇编菜鸟,求大神帮助啊!
DATA SEGMENT
    VAR1 DD 45218763H
    VAR2 DD 62578453H
    VAR3 DD 00000000H,"$"
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
    CLC
    LEA SI,VAR1
    INC SI
    INC SI
    MOV AX,DS:[SI]
    LEA SI,VAR2
    INC SI
    INC SI
    ADC AX,DS:[SI]
    LEA SI,VAR1
    MOV DX,DS:[SI]
    LEA SI,VAR2
    ADC DX,DS:[SI]
    LEA SI,VAR3
    MOV DS:[SI],DX
    INC SI
    INC SI
    MOV DS:[SI],AX
    MOV DX,OFFSET VAR3
    MOV AH,09H
    INT 21H
    MOV AH,4CH
    INT 21H
CODE ENDS
END START
10 回复
#2
Agdmeg2012-08-10 18:32
怎么总是没人回答a???
#3
Agdmeg2012-08-10 18:36
....
#4
有容就大2012-08-10 18:37
王爽的书都还没看完 不懂 帮顶!
#5
zklhp2012-08-10 21:46
以下是引用Agdmeg在2012-8-10 18:32:09的发言:

怎么总是没人回答a???

为啥没人答 因为你的程序思路不清晰 看不懂 所以没人答 不知道你自己思路清晰不清晰 我就不改你的程序了 再写一个

程序代码:


DATA SEGMENT
    VAR1 DD 45218763H
    VAR2 DD 62578453H
    VAR3 DD 00000000H,"$"
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
   
    clc
    mov ax, WORD ptr [VAR1]
    adc ax, WORD ptr [VAR2]
    mov WORD ptr [VAR3], ax
   
    mov ax, WORD ptr [VAR1+2]
    adc ax, WORD ptr [VAR2+2]
    mov WORD ptr [VAR3+2], ax
   
    MOV AH,4CH
    INT 21H
CODE ENDS
END START



为啥你的不行呢 因为这个进位标志位会被某些指令重置 故而adc指令之间不要有太多的指令 你写了很多 所以会出错
#6
Agdmeg2012-08-11 00:39
谢谢大神,编译测试的确是A7790BB6,但我程序中到底哪些指令会重置CF?我用的这些指令在书上没有说会重置CF啊?
#7
Agdmeg2012-08-11 00:44
书上只有INC指令说:会影响AF,OF,PF,SF,但对CF不影响
#8
Agdmeg2012-08-11 02:19
我将代码稍微改了下,运行测试成功
DATA SEGMENT
    VAR1 DD 45218763H
    VAR2 DD 62578453H
    VAR3 DD 00000000H,"$"
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
    CLC
    LEA SI,VAR1
    MOV AX,DS:[SI]
    LEA SI,VAR2
    ADD AX,DS:[SI]
    LEA SI,VAR1
    MOV DX,DS:[SI+2]
    LEA SI,VAR2
    ADC DX,DS:[SI+2]
    LEA SI,VAR3
    MOV DS:[SI],AX
    INC SI
    INC SI
    MOV DS:[SI],DX
    MOV DX,OFFSET VAR3
    MOV AH,09H
    INT 21H
    MOV AH,4CH
    INT 21H
CODE ENDS
END START   
#9
Agdmeg2012-08-11 02:37
我知道出错原因了,我原来的代码先将高4位相加,也就是4521H+6257H,没有产生进位,然后再用ADC相加低四位8763H+8453H,这次产生了进位,但我的加法运算在此结束,所以最终导致进位没有加上,于是我将高4位、低四位的顺序换一下,最终运行结果正确了
#10
爱末流2012-08-17 11:23
DATA SEGMENT
     VAR1 DD 45218763H
     VAR2 DD 62578453H
     VAR3 DD 00000000H,"$"
 DATA ENDS
 
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA
 START:
     MOV AX,DATA
     MOV DS,AX
     CLC            ;cf=0
     LEA SI,VAR1    ;si=VAR1偏移
     INC SI         ;从高位相加,记住CPU一般使用小尾顺序的,所以SI+2 就指向了高地址
     INC SI        
     MOV AX,DS:[SI] ;将4521传送给AX
     LEA SI,VAR2    ;si==VAR2偏移
     INC SI         ;inc不影响CF进位标志
     INC SI         
     ADC AX,DS:[SI] ;4521+6257+CF, 没有测试过,进位不知道加到AX中还是DX中了
     LEA SI,VAR1    ;以下就不多注释了
     MOV DX,DS:[SI]  
     LEA SI,VAR2
     ADC DX,DS:[SI]
     LEA SI,VAR3
     MOV DS:[SI],DX
     INC SI
     INC SI
     MOV DS:[SI],AX
     MOV DX,OFFSET VAR3
     MOV AH,09H
     INT 21H
     MOV AH,4CH
     INT 21H
 CODE ENDS
 END START
#11
爱末流2012-08-17 11:25
回复 6楼 Agdmeg
inc 不会影响CF位,ADC会影响全部状态标志位 如: ZF CF OF SF AF PE
1