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

2 回答 2

2

You can simply check if the number is less than zero and then use neg instruction to negate it and apply the negative sign - to the resultString buffer:

Code for writeVal will be:

writeVal PROC USES eax ecx edi
    LOCAL   resultString[11]:BYTE
    lea     eax, resultString

    mov     ecx, [ebp + 8]          ; load passed number to ebx
    test    ecx, ecx                ; test number to see if it's less than zero
    jnl     non_negative            ; jump if not less to non_negative

    neg     ecx                     ; else we have a negative number so neg to make it positive
    mov     byte ptr [eax], '-'     ; set resultString[0] to '-'
    inc     eax                     ; increase resultString ptr + 1

    non_negative:

    push    eax                  ; push the resultString + 1
    push    ecx                  ; push the number
    call    intToStr             ; convert the number
    lea     eax, resultString
    printc  eax                  ; print num
    ret     4
writeVal ENDP

Compile and run:

start:

    push -14286754
    call writeVal

    exit

end start

Will print:

-14286754
于 2020-03-16T02:33:05.647 回答
2

如果输入是否定的,请在某处(在寄存器中)记录该事实和neg您的输入编号。(例如test eax,eax/jnl跳过一个不小于 0 的块,否则落入处理这种情况的块。)

然后以正常方式进入缓冲区进行unsigned int -> string 转换(使用divnot )。idiv

如果您使用 push/pop 策略来反转数字,您可以将 a'-'放入缓冲区并立即增加指针。否则,请等到末尾添加 a'-'如果您从缓冲区末尾开始以最低有效的一阶存储数字并递减指针(如如何在没有来自 c 的 printf 的情况下在汇编级编程中打印整数图书馆?

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

于 2020-03-15T23:03:06.450 回答