在nasm中,3位整数到可打印的3位数字符串?

时间:2014-12-15 07:43:09

标签: linux string assembly x86 nasm

我的节目即将完成,并且应该是tommrow。但是我确定了问题的根源。我骑自行车通过几个功能,掷骰子1-6并将结果添加到缓冲区以保持得分。然后,当我想要打印时,我只能打印单位数整数和任何两位数字,如10或通过我的write_number函数进行更大的循环,直到出现seg错误。我怎样才能改变这个算法以容纳最多三位数的整数,因为在程序结束之前得分需要进展到100?除非我的任务是使用在线发现的工作函数,否则任何人都有更好的先前编码算法。拜托,非常感谢任何见解!

section .bss

userScore: resd 4
pcScore: resb 4

number: resd 4
digit: resd 4
count:  resd 4  

. . . . . . . . . . .

    cmp edx, 6 ;dice roll result
    call write_number
    jmp printReadOption

write_number:

    add dword[userScore], edx
    mov edx, dword[userScore]
    mov dword[number], edx
        mov eax, dword[number]
        mov ecx, 0Ah ;hex for 10
        cdq
        div ecx ;eax=number/10,edx=number%10
        mov dword[number], eax ;number= number/10
        add edx, 30h ;add 48 (30h) to make a printable character
        push edx ;push edx in to the stack and
        inc dword[count] ;increment count of numbers in the stack
        cmp dword[number], 0 ;if number != 0, loop again
        jne write_number

loop2:

        pop dword[digit] ;pop the digit from the stack and
        call write_digit ;write it
        dec dword[count] ;decrement the count
        cmp dword[count], 0 ; if count != 0, loop again
        jne loop2
        ret

write_digit:    ;Print score

    mov eax, 4
    mov ebx, 1
    mov ecx, userScoreIs
    mov edx, userScoreIsLen
    int 80h

    mov eax, 4
    mov ebx, 1
    mov ecx, digit ;score to print
    mov edx, 4
    int 80h
    ret

1 个答案:

答案 0 :(得分:0)

在每次循环迭代开始时,您不断添加潜水数量 (add dword[userScore], edx), 所以商可能永远不会达到零,这最终会导致你将太多数字推到堆栈上。以下评论中列出的迈克尔的补充。