Я уже нервничаю по поводу публикации этого вопроса, но вот оно. Я пытаюсь разработать программу сборки, которая принимает два целых числа, а затем операнд (*, + или ^). Затем, в зависимости от операнда, программа выполнит арифметическую последовательность на основе выбранного операнда. Вывод должен выглядеть именно так, скажем, пользователь вводит 5, затем пользователь вводит 6 и, наконец, пользователь вводит *, программа должна распечатать
OP 5 * 6 = 30
По какой-то причине я не могу понять концепцию printf, поэтому моя функция печати внизу — это мой нелепый способ попытаться распечатать это. Если бы кто-нибудь мог объяснить мне, как работает printf, я был бы рад это услышать! У меня есть очень базовые знания о стеке. Кроме того, у меня нет экспоненциальной функции, потому что я понятия не имею, как это сделать на ассемблере. И, наконец, у меня есть вопрос, не связанный с программой, для истинных компьютерных богов... Я абсолютно ненавижу язык ассемблера, у меня проблемы с написанием основных операций на этом языке. Мне нравилось работать на C, CPP и Java... Этот язык абсолютно необходим для выживания программиста изо дня в день, или это урок истории о том, как люди добывали огонь до того, как у них появились зажигалки? В любом случае, любые ответы на любые вопросы приветствуются, и заранее спасибо.
;program to add, multiply, or give the power of a number
%include "asm_io.inc"
segment .data
prompt1 db "Enter a number: ", 0 ;prompts
prompt2 db "Enter another number: ", 0
prompt3 db "Enter an operand", 0
prompt4 db "OP ", 0 ;idiotic prompts for printing
prompt5 db " = ", 0 ;another printing prompt
segment .bss
num1 resd 1 ;variable for 1st number
num2 resd 1 ;variable for 2nd number
op resd 1 ;variable for operand
segment .text
global asm_main
asm_main:
enter 0,0 ; setup routine
pusha
restart:
mov eax, prompt1 ; print out prompt
call print_string
call print_nl
call read_int ; read integer
mov [num1], eax ; store into num1
call print_nl
mov eax, prompt2 ; print out prompt
call print_string
call print_nl
call read_int ; read integer
mov [num2], eax ; store into num2
call print_nl
mov eax, promtp3 ;print out prompt
call print_string
call print_nl
call read_char ;read operand and dispose of null
call read_char
mov [op], eax ;store operand in [op]
call print_nl
cmp [op], '*' ;operand comparison
jne jmp1
call mulFun
jmp restart
jmp1: cmp [op], '+' ;operand comparison
jne jmp2
call sumFun
jmp restart
jmp2: cmp [op], '^' ;operand comparison
jne jmp3
call expFun
jmp restart
jmp3: cmp [op], 'e' ;exit function
je end1
end1:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call print_nl ; pr
popa
mov eax, 0 ; return back to C
leave
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mulfun: ;multiplication function
mov ebx, [num1]
mov ecx, [num2]
imul ebx, ecx
jmp printFun
sumFun: ;sum function
mov ebx, [num1]
mov ecx, [num2]
add ebx, ecx
call printFun
printFun: ;printing function
mov eax, [prompt4]
call print_string
mov eax, [num1]
call print_string
mov eax, [op]
call print_string
mov eax, [num2]
call print_string
mov eax, [prompt5]
call print_string
mov eax, ebx
call print_string
call print_nl
ret
asm_io.inc
, который предоставляет вам основные помощники ввода-вывода. Поэтому используйте все, что он предоставляет, чтобы печатать части одну за другой, например.call write_char
иwrite_int
иwrite_string
(используйте любые функции, которые у вас действительно есть, с соответствующим аргументом). - person Jester   schedule 04.11.2015