Assembly 汇编代码可以';t处理负整数

Assembly 汇编代码可以';t处理负整数,assembly,x86-64,Assembly,X86 64,我的汇编代码由两部分组成,一部分称为A.s,另一部分称为B.s A.s是我的“主”,我将输出流传输到终端 B.s不能处理负整数,并且还会显示两次“欢迎消息” 这是代码 B.s代码 some code above this----------------- LoopNextInt: movq $buffInPtr, %r10 movq $buffIn, %r9 addq (%r10), %r9 xorq %r8, %r8 addq

我的汇编代码由两部分组成,一部分称为A.s,另一部分称为B.s

A.s是我的“主”,我将输出流传输到终端

B.s不能处理负整数,并且还会显示两次“欢迎消息”

这是代码

B.s代码

some code above this-----------------
LoopNextInt:
    movq    $buffInPtr, %r10
    movq    $buffIn, %r9
    addq    (%r10), %r9
    xorq    %r8, %r8

    addq    (%r9),%r8

    cmpq    $63, (%r9)
    je  inImage

    cmpq    $' ', (%r9)
    je  retNeg

    cmpq    $'-', (%r9)
    je  negSignFound

    cmpb    $'0', (%r9)
    jl  retNeg

    cmpb    $'9', (%r9)
    jg  retNeg

    movzbq  (%r9),%r11

    imulq   $10, %rax
    subq    $'0', %r11  #asci -> dec tal
    addq    %r11, %rax
    //addq  $1, (%r10)
    incq    buffInPtr
    //addq  $1, %r9
    incq    buffIn

    jmp     LoopNextInt

some code below this-----------------
then comes this ---------------     
fillOutBuffWithChars:
    movq    $buffOutPtr,%r9
    cmpq    $63, (%r9)  
    je      outImage                
    movzbq  (%rdi), %r8             
    movb    %r8b, (%r10)                
    cmpq    $0, (%rdi)              
    je      zeroInStringFoundz

    addq    $1,%rdi
    addq    $1,%r10
    //addq  $1,%r9
    incq    buffOutPtr
    jmp     fillOutBuffWithChars

zeroInStringFoundz: 
    ret
程序的测试运行

Start. Enter 5 numbers, both negative and pos numbers.
Start. Enter 5 numbers, both negative and pos numbers.
5 1 3 6 -5        
5+1+3+6+0=15
5
125
End
Made by Jozo
我注意到,如果我用一个更小的句子,比如“输入5个数字”,它将不会打印两倍

编辑;删除了不必要的代码,这样新用户可以更容易地看到问题。

cmpq$0、(%rdi)应该是
cmpb$0、(%rdi)
或者干脆
cmp$0、%r8b
,因为字节已经加载。如果比较一个四字而不是一个字节,它将找不到字符串的结尾,这将导致从
putText
内部调用
outImage
,因此文本已经打印出来。但随后您再次在
main
中调用
outImage
,因此输出加倍

LoopNextInt
中也存在同样的问题,其中所有四字比较都应为字节大小。实际上,
negSignFound
从未到达,这意味着
revInt
也从未到达

PS:学习使用调试器并注释您的代码。

cmpq$0,(%rdi)应该是
cmpb$0,(%rdi)
或者干脆
cmp$0,%r8b
,因为字节已经加载。如果比较一个四字而不是一个字节,它将找不到字符串的结尾,这将导致从
putText
内部调用
outImage
,因此文本已经打印出来。但随后您再次在
main
中调用
outImage
,因此输出加倍

LoopNextInt
中也存在同样的问题,其中所有四字比较都应为字节大小。实际上,
negSignFound
从未到达,这意味着
revInt
也从未到达

PS:学习使用调试器并注释代码