Новое в сборке x64, не уверен, почему пользовательский ввод по-прежнему 0 - PullRequest
0 голосов
/ 15 марта 2020

Моя программа должна прочитать набор целых чисел со знаком и отобразить наибольшее и наименьшее введенные значения. Когда после ввода вводится ноль, он печатается, но если первое введенное значение равно 0, программа должна сразу завершиться, ничего не отображая. Застрял на выяснении, как сохранить все числа, которые вводит пользователь, так как это всего лишь 0, когда я тестирую печать, поэтому я предполагаю, что значения уничтожаются. Я еще не разобрался с l oop, чтобы сравнить цифры, потому что я уже давно бьюсь об этом и искал неумелый способ заставить часового работать, но я доберусь до этого. Может кто-нибудь намекнуть мне, что я делаю не так?

Выход:

Enter a series of numbers:
100
250
500
0
Largest: 0
Smallest: 0

Исходный код:


extrn DisplayString:          PROTO
extrn DisplayNewline:         PROTO
extrn ReadInt:                PROTO
extrn DisplayInt:           PROTO
extrn ExitProcess:            PROTO

.data
msg1            byte    'Enter a series of numbers: ', 0
largestMsg      byte    'Largest: ',0
smallestMsg     byte    'Smallest: ',0

.data?
input               byte    ?
smallest            word    ?
largest             word    ?           
numsEntered         byte    ?


.code

main        PROC

                ;Prepare for stacks
                sub     rsp, 32                 ;reserve shadow space
                push    rbp                     ;save non-volatile base pointer
                mov     rbp, rsp                ;make frame pointer for direct access
                mov     rcx, 100                ;get address of request
                lea     rbx, numsEntered        ;get address of array

                ;Print prompt
                lea     rcx, msg1               ;store in address the prompt
                call    DisplayString           ;print message
                call    DisplayNewline          ;print new line

                ;Get First input and compare to sentinel
                lea     rcx, input              ;point input to address
                call    readInt                 ;read user input
                push    rcx
                mov     r12b, input             ;store input in register
                cmp     r12b, 0                 ;compare input to sentinal
                je      Continue                ;if input = to sentinal exit code
                jg      asknum                  ;if input greater than sentinal jp to loop


asknum:         ;Read and compare user input until they enter 0
                lea     rcx, input              ;point input to address
                call    readInt                 ;read user input
                mov     r12b, input             ;store input in register
                cmp     input, 0                ;compare input to sentinal
                je      PrintLargest            ;if user types sentinal after inputs, jp to print largest num

                loop    asknum                  ;loop for user input

PrintLargest:
            lea     rcx, largestMsg             ;point to prompt address
            call    DisplayString               ;print prompt largestMsg
            lea     rcx, largest                ;point largest integer to address
            call    DisplayInt                  ;print largest integer
            call    DisplayNewline              ;print new line
            jp      PrintSmallest               ;jump to calculate smallest integer

PrintSmallest:
            ;after printing largest, print the smallest
            lea     rcx, smallestMsg            ;point to prompt address
            call    DisplayString               ;print prompt smallestMsg
            lea     rcx, smallest               ;point smallest integer to address
            call    DisplayInt                  ;print smallest integer 
            jp      Continue                    ;jump to exit code

Continue:
        pop     rbp                     ;clear stack
        add     rsp, 32                 ;restore shadow space
        call    ExitProcess             ;exit code

main        ENDP
END

Output:


...