2017-01-23 24 views
2

Я очень новичок в MASM и сборке, и я пишу свою первую программу. Мне трудно понять, как добавить две переменные вместе и вывести результат. Вот часть моей программы до сих пор:Как добавить две десятичные переменные в MASM x86 и вывести сумму

INCLUDE Irvine32.inc 

.data 
firstNum DWORD ? 
secondNum DWORD ? 
sum  DWORD ?  

.code 
main PROC 

;Get Data 

call  ReadInt 
mov  firstNum, eax 
call  ReadInt 
mov  secondNum, ebx 

;Calculate Sum 

mov  eax, firstNum 
mov  ebx, secondNum 
add  eax, ebx 
mov  sum, eax 

;Display Results 

mov  eax, sum 
call  WriteDec 

Когда я запускаю этот код, он выводит некоторые длинный номер «333420163» вместо того, что сумма должна быть, которая 7. Я еще новичок в этом так если это простой ответ, извините, ха-ха. Что я делаю не так?

+1

Я не знаю irvine, но 'mov secondNum, ebx' не может быть правильным, если' mov firstNum, eax' был. Если «ReadInt» возвращает значение read в EAX, второй ход должен быть «mov secondNum, eax» – Tommylee2k

+0

Спасибо, я был смущен, потому что думал, что если бы я переместил secondNum в eax, он заменил бы первую переменную. Я все еще не совсем уверен, как работают эти регистры. Это сработало после того, как я сделал то, что сказал! – Conman97

+0

«mov» работает наоборот. если вы пишете «mov variable, eax», тогда содержимое eax перемещается в эту память, а не FROM там ;-) Очевидно, что «ReadInt» перенастраивает значение в EAX после сохранения этого значения в firstNum, EAX может быть снова использован снова – Tommylee2k

ответ

1

В большинстве ИБП x86 возвращаемые значения для функций обычно находятся в регистре EAX, а в случае, когда возвращаемое значение имеет длину 64 бит, вместо 32-разрядных, верхние 32-битные будут в EDX зарегистрироваться.

Ваши инструкции:

call  ReadInt 
mov  secondNum, ebx 

не получают возвращаемое значение из второго вызова ReadInt, потому что это не в EBX; он находится в EAX.

Замените его на mov secondNum, eax, потому что это положит фактическое возвращаемое значение от ReadInt до secondNum.

+0

Это еще проще: если первый вызов 'ReadInt' возвращает результат в' EAX', второй звонок тоже обязательно это сделает. – zx485

 Смежные вопросы

  • Нет связанных вопросов^_^