我应该从用户处获取带符号的整数,计算输入数字的总和,然后显示平均值。问题是,负数似乎无法正确显示,尽管我知道总和和平均值计算正确。
我需要在程序中添加什么才能解决负数问题,以便正确显示?
.
.
.
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
.
.
.
如果输入为负,则将该事实记录在某个地方(在寄存器中),然后输入您的输入数字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位无符号。
您可以简单地检查数字是否小于零,然后使用neg
指令对其求反,并将负号neg
应用于-
缓冲区: