assembly - 如何将负整数转换为字符串并在 MASM Assembly 中输出

标签 assembly x86 masm signed-integer

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

我需要在程序中添加什么来考虑负数,以便正确显示它们?

.
.
.
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
.
.
.

最佳答案

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

然后以正常方式将无符号 int -> 字符串转换为缓冲区(使用div 而不是idiv)。

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

使用无符号处理最大负整数-2147483648、位模式0x8000000的极端情况。它的绝对值不能表示为32位2的补码正整数,只能表示为32位无符号。

关于assembly - 如何将负整数转换为字符串并在 MASM Assembly 中输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60698450/

相关文章:

c++ - CPU 如何知道任何变量的地址?

c - undefined reference `WinMain@16'collect2.exe : error: ld returned 1 exit status

windows - 汇编语言 (MASM) 和 Spectre : Variant 2 (CVE-2017-5715) Branch Target Injection

组装在模式 x 中读取平面是否需要与写入不同的输出到 VGA 端口?

assembly - 如何确定何时设置零标志、符号标志、溢出标志和进位标志?

c - 如何在C程序中调用汇编程序- Visual Studio 2010

c++ - 同样的AVX指令集代码,英特尔酷睿与AMD锐龙性能差距巨大

assembly - AT&T 语法中 (%eax) 的含义?

winapi - 错误 LNK2001 : unresolved external symbol _MessageBox

assembly - 何时在 MASM 中将 EXTERNDEF 与 ABS 一起使用?