Началась сборка, простой вопрос калькулятора - PullRequest
0 голосов
/ 08 февраля 2019

Хочу сказать, что я полный нуб на сборке и начал изучать это всего несколько дней назад.Узнал немного о пользовательском вводе, регистрах и определениях.Теперь я попытался объединить все это в программе калькулятора.Но при первом суммировании есть проблема.Программа выводит приветственное сообщение, но результат не печатается.
Может кто-нибудь мне помочь, пожалуйста?

<code>
section .bss
sinput1: resb 255
sinput2: resb 255</p>

<p>section .data
msg db 'Welcome to the Calculator',0xa
lenMsg equ $ - msg</p>

<p>section .text
global _start</p>

<p>_start:
;Print out the Welcome message
mov eax,4
mov ebx,1
mov edx, lenMsg
mov ecx, msg
int 80h
;Input first digit
mov edx,255
mov ecx,sinput1
mov ebx,0
mov eax,3
int 80h
;Input second digit
mov edx,255
mov ecx,sinput2
mov ebx,0
mov eax,3
int 80h
;Sum them up
mov esi,sinput1
mov edx,sinput2
add esi,edx
;Print out the result
mov eax,4
mov ebx,1
mov edx, 255
mov ecx, esi
int 80h
;Quit the program
mov eax,1
int 80h

1 Ответ

0 голосов
/ 11 февраля 2019

Инструкция mov esi, sinput1 перемещает адрес вашего первого буфера в регистр ESI, но вам действительно нужен байт, который там хранится.Вы извлекаете его через mov al, [sinput1].
Аналогично, инструкция mov edx, sinput2 перемещает адрес вашего второго буфера в регистре EDX, но вы действительно хотите, чтобы байт там хранился.Вы получаете его через mov dl, [sinput2].

Далее эти байты будут символами, возможно, в диапазоне от «0» до «9», но вашему дополнению хотелось бы работать со значениями, которые представляют эти символы.Чтобы это произошло, вам нужно вычесть 48 из кодов ASCII обоих символов.

Как только вы получите правильную сумму, вам необходимо преобразовать ее в символ, готовый для отображения.Для этого необходимо добавить 48, чтобы получить код ASCII, который может использовать sys_write.

Приведенный ниже код выдаст

Добро пожаловать в калькулятор
7

при вводе с помощью следующих клавиш

3 Ввод 4 Ввод

mov al, [sinput1]   ; Character "3"
sub al, '0'         ; Convert to 3
mov dl, [sinput2]   ; Character "4"
sub dl, '0'         ; Convert to 4
add al, dl          ; Sum is 7
add al, '0'         ; Convert to character "7"
mov ah, 0Ah         ; Newline
mov [sinput1], ax   ; Store both in buffer

;Print out the result
mov edx, 2          ; Character and Newline
mov ecx, sinput1    ; Buffer
mov ebx, 1          ; Stdout
mov eax, 4          ; sys_write
int 80h

Чтобы это стало надежной программой, вам все еще нужно

  • , чтобы проверить правильность обоих входов
    • Было ли что-либо введено вообще?Проверьте EAX из sys_read !
    • Представляет ли вход число?
    • Находится ли этот номер в допустимом диапазоне?
  • для подготовки, когда сумма больше 9 (требуется более 1 выходного символа).
...