Сравнение негативов и накопление в сборке

Мне трудно понять, как сравнивать входные данные с отрицательными в MASM. Обычно для положительных целых чисел я бы просто использовал cmp, но, похоже, это не работает для меня в этой программе.

Мне также не хватает одной или двух строк в моем calcLoop, я думаю, потому что программа просто завершается сразу после того, как пользователь вводит положительное значение, после ввода всех отрицательных значений. Эта программа должна просто суммировать и усреднять все введенные значения, все, кроме одного, должны быть отрицательными между [-100,-1]. Также, когда я ввожу -100 или -1, это должно быть разрешено, но не разрешено.

Любая помощь будет принята с благодарностью, так как я все еще пытаюсь понять некоторые основы ассемблера. Спасибо!

Код:

TITLE Program3     (program3.asm)

INCLUDE Irvine32.inc

LENGTHLIMIT = 20

.data 
intro BYTE "Program 3: Accumulator by  ", 13,10
            BYTE "What is your name: ",0

prompt1 BYTE "Oh hello, ",0

enterNumPrompt BYTE "Enter numbers between -100 and -1.",13,10
                BYTE "Enter a non-negative now: ",13,10,0

prompt2 BYTE "Enter #: ",0
prompt3 BYTE "Okay, ",0
prompt4 BYTE " numbers.",0

addPrompt BYTE "The sum of the numbers entered is, ",0
roundPrompt BYTE "The rounded average is: "

errorPrompt BYTE "Whoops! Only numbers less than or equal to -1, please",13,10,0

nameInputLimit BYTE 24 DUP(0)

seeya BYTE "Thanks for using the accumulator, "
seeyaName BYTE "!"


numEntered DWORD ?
amountOfNums DWORD ?
result DWORD ?
sumResult DWORD ?
avgResult DWORD ?

.code
main PROC

mov edx, OFFSET intro
call Crlf
call WriteString
mov edx, OFFSET nameInputLimit
mov ecx, SIZEOF nameInputLimit
call ReadString


mov edx, OFFSET prompt1
call WriteString
mov edx, OFFSET nameInputLimit
call WriteString
call Crlf

mov edx, 0000000h

mov edx, OFFSET enterNumPrompt
call WriteString
call Crlf
call Crlf

getLoop:

mov edx, OFFSET prompt2
call WriteString
call ReadInt
cmp eax, -100

jg errorLoop

cmp eax, -1
jl complete

jmp calcLoop

errorLoop:

mov edx, OFFSET errorPrompt
call WriteString
jmp getLoop

calcLoop: ;missing a line or two here I think

mov numEntered, eax
mov eax, result
add eax, numEntered
mov result, eax

jmp getLoop

complete:

call Crlf
mov numEntered, eax


goodbye:

mov edx, OFFSET seeya
call WriteString

exit





; (insert executable instructions here)

exit    
main ENDP

; (insert additional procedures here)

END main

person austinscode    schedule 02.02.2016    source источник
comment
cmp eax, -100; jg errorLoop - это должно вызвать переход к errorLoop, если значение больше -100 - это не похоже на то, что вы хотите.   -  person 500 - Internal Server Error    schedule 03.02.2016
comment
Да, он должен допускать -100 в качестве входных данных и что-либо между -100 и -1, но ничего за пределами этого диапазона, поэтому, если я поставлю -101 и 0, я не думаю, что это будет работать должным образом. Проблема в том, что я не думаю, что правильно сравниваю негативы, возможно, мне следует использовать другой синтаксис. Или это проблема в моем calcLoop, как я уже сказал, я не знаю, чего мне не хватает, чтобы все сложить, но это может быть единственная проблема?   -  person austinscode    schedule 03.02.2016


Ответы (1)


Ваши инструкции выбраны правильно, но ход программы нуждается в некоторых исправлениях.

Просто для ясности, это соответствующие инструкции по сравнению.

JG  - Greather than? (signed numbers e.g. -128 to 127)
JL  - Less than?     (signed numbers e.g. -128 to 127)
JA  - Above?         (unsigned numbers e.g. 0 to 255)
JB  - Below?         (unsigned numbers e.g. 0 to 255)

Ниже приведена фиксированная версия вашего основного цикла:

...
getLoop:
mov edx, OFFSET prompt2
call WriteString
call ReadInt
; !!!TODO!!! Add an abort condition jumping to 'complete' here!
cmp eax, -100
jl errorloop         ; was 'jg errorLoop' - better goto error if less than -100   
cmp eax, -1
jg errorloop         ; was 'jl complete' - now error on value greater than -1
add result, eax      ; more is not necessary
jmp getLoop

errorLoop:    
mov edx, OFFSET errorPrompt
call WriteString
jmp getLoop
person zx485    schedule 03.02.2016
comment
Похоже, нужно было исправить всего несколько проблем. Вы уверены, что код в calcLoop правильный? Как я сейчас вижу, программа вылетает, как только вводится имя. Где программа должна вызвать calcLoop, чтобы сложить все числа? Не уверен, почему произошел сбой, хотя ваши инструкции кажутся прекрасными. Спасибо за помощь! - person austinscode; 04.02.2016
comment
Код, который я изменил, (почти) не дает сбоев, потому что, кроме add result, eax, ни одна из инструкций не может вызвать сбой. Значит, он должен быть где-то еще. Почему вы не используете отладчик? calcLoop на самом деле есть: после чтения числа оно проверяется на диапазон, а затем добавляется к общему количеству result с add result, eax. - person zx485; 04.02.2016
comment
Хорошо, я понял, что он падает возле этой строки mov edx, 0000000h. Теперь он позволяет мне получать входные данные, но выдает ошибку, когда я ввожу положительный результат, хотя это должен быть конец входных данных, и он должен вычислить результат в этой точке. Я предполагаю, что именно здесь вы предлагаете TODO перейти к complete, так что я возьму это на себя. Спасибо за вашу помощь! - person austinscode; 04.02.2016