我应该从用户那里获取有符号整数,计算输入数字的总和,然后显示平均值。问题是,负数似乎没有正确显示,尽管我知道总和和平均值计算正确。
我需要在程序中添加什么来考虑负数,以便正确显示它们?
.
.
.
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/