回 帖 发 新 帖 刷新版面

主题:[讨论]请教多位数加法问题

程序如下:
.386
.model     flat,stdcall
option  casemap:none
includelib    msvcrt.lib
printf     proto c:ptr byte,:vararg
.data
    op1_1    dword    10002032h
    op1_2    dword    21003584h
    op1_3    dword    54575456h
    op1_4    dword    28645334h
    op2_1    dword    81453453h
    op2_2    dword    10002548h
    op2_3    dword    42015451h
    op2_4    dword    18432456h
    op3_1    dword    ?
    op3_2    dword    ?
    op3_3    dword    ?
    op3_4    dword    ?
    szMsg    byte    "结果为:%d%d%d%d。",0ah, 0
.code
start:
    MOV    EAX,    op1_1
    MOV    EBX,    op1_2
    MOV    ECX,    op1_3
    MOV    EDX,    op1_4
    ADD    EAX,    op2_1
    ADC    EBX,    op2_2
    ADC    ECX,    op2_3
    ADC    EDX,    op2_4
    MOV    op3_1,    EAX
    MOV    op3_2,    EBX
    MOV    op3_3,    ECX
    MOV    op3_4,    EDX
    invoke printf, offset szMsg,
        op3_4, op3_3, op3_2, op3_1
    ret
end    start 
最后结果出现了负号...我汗啊

结果为:1084716938-1772574553822106828-1857727355。

不是用ADC指令 会把进位算到CF中去吗?
怎么才能把负号消去?请教了

回复列表 (共2个回复)

沙发

;错就错在这里,注意进制的转换(你最好亲手写个机器数转换10进制数字符串的程序,你就能明白了),如果怕麻烦,可以 16 进制输出,这样不需要额外处理
invoke printf, offset szMsg, op3_4, op3_3, op3_2, op3_1

板凳

你的意思是在进制转换的时候出问题了?
我去写个转换程序看看 
先谢谢了

我来回复

您尚未登录,请登录后再回复。点此登录或注册