如何将负整数转换为字符串并在MASM汇编中输出

问题描述 投票:1回答:2

我应该从用户处获取带符号的整数,计算输入数字的总和,然后显示平均值。问题是,负数似乎无法正确显示,尽管我知道总和和平均值计算正确。

我需要在程序中添加什么才能解决负数问题,以便正确显示?

.
.
.
writeVal PROC   USES eax
    LOCAL   resultString[11]:BYTE
    lea     eax, resultString
    push    eax
    push    [ebp + 8]
    call    intToStr
    lea     eax, resultString
    displayString eax ; print num
    ret     4

writeVal ENDP


intToStr PROC       USES eax ebx ecx
    LOCAL   tempChar:DWORD

    mov     eax, [ebp + 8]
    mov     ebx, 10
    mov     ecx, 0
    cld

divideByTen:
    cdq
    idiv    ebx
    push    edx
    inc     ecx
    cmp     eax, 0
    jne     divideByTen
    mov     edi, [ebp + 12] ; move into dest array
    jmp     storeChar

;store char in array

storeChar:
    pop     tempChar
    mov     al, BYTE PTR tempChar
    add     al, 48
    stosb
    loop    storeChar
    mov     al, 0
    stosb
    ret     8

intToStr ENDP
.
.
.
assembly x86 masm signed-integer
2个回答
1
投票

如果输入为负,则将该事实记录在某个地方(在寄存器中),然后输入您的输入数字neg。 (例如,如果test eax,eax / jnl不小于0,则跳过该块,否则落入处理该情况的块中。)

然后执行unsigned int->字符串转换(使用div而不是idiv)以通常的方式进入缓冲区。

如果使用推/弹出策略来反转数字,则可以将'-'放入缓冲区并立即增加指针。否则,如果要从缓冲区的末尾开始以最低有效顺序存储数字并递减指针(例如'-'),请等到最后加上How do I print an integer in Assembly Level Programming without printf from the c library?

使用无符号处理最大负整数-2147483648(位模式0x8000000)的特殊情况。其绝对值不能表示为32位2的补正整数,只能表示为32位无符号。


0
投票

您可以简单地检查数字是否小于零,然后使用neg指令对其求反,并将负号neg应用于-缓冲区:

© www.soinside.com 2019 - 2024. All rights reserved.