регистр x86 ax получает другое значение? - PullRequest
0 голосов
/ 06 июня 2018

Я хочу сравнить топор с 5, если значение больше 5, появится окно с ошибкой.Если нет, он просто напечатает номер.Но это всегда показывает, что значение больше 5, даже если я ввожу 1. Откуда возникла проблема?

.386 
.model flat,stdcall 
option casemap:none 

include c:\masm32\include\windows.inc
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib

.data 
msg db "Enter Number", 0
msg1 db "The value is too large", 0

.data? 
input db 150 dup(?)
output db 150 dup(?)
.code 


start: 
push offset msg
call StdOut 

push 100
push offset input
call StdIn

lea ax, input
cmp ax, 5
jg Toolarge


exit:
    push 0
    call ExitProcess 

 Toolarge:
     push offset msg1
     call StdOut
     jmp start

end start

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

MASM32 поставляется с файлом справки: \masm32\help\masmlib.chm.Он говорит:

StdIn получает текст входные данные с консоли и помещает их в буфер, требуемый в качестве параметра.Функция завершается при нажатии Enter.

Я пометил соответствующее слово «текст».Таким образом, вы получите строку ASCII, а не число, подходящее для AX.Сначала вы должны преобразовать его в «целое число», прежде чем сможете сравнить его с cmp.Вы можете использовать функцию MASM32 atol:

.386
.model flat,stdcall
option casemap:none

include c:\masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib

.data
    msg db "Enter Number", 0
    msg1 db "The value is too large", 0

.data?
    input db 150 dup(?)
    output db 150 dup(?)
.code

start:

    push offset msg
    call StdOut

    push 100
    push offset input
    call StdIn

    push offset input
    call atol

    cmp eax, 5
    jg Toolarge

exit:

    push 0
    call ExitProcess

Toolarge:

    push offset msg1
    call StdOut
    jmp start

end start
0 голосов
/ 06 июня 2018

Попробуйте использовать

mov ax, input

вместо

lea ax, input

Lea загружает указатель на элемент, к которому вы обращаетесь (что-то вроде 0x12345678), тогда как mov загружает фактическое значение по этому адресу,

...