Так что у меня проблема с выполнением домашнего задания для ассемблерного кода. Код должен просто выполнять простое умножение, но он не может использовать функцию imul или что-то простое, он должен использовать сдвиги.
Должно быть что-то не так с ассемблерным кодом, потому что когда у меня есть emacs, скомпилированный и запускающий main.c и multiply.s, без того, чтобы main.c фактически вызвал функцию умножения, он выводит просто отлично. С другой стороны, когда я вызываю функцию умножения, это заставляет ее не выводить
ВХОД У меня есть:
Я ожидаю, что мой c-файл со следующим кодом вызовет умножение на x и y, которые определены как 34 и 47 соответственно.
#include <stdio.h>
extern int multiply();
extern int x, y;
int main()
{
x = 34;
y = 47;
printf("%d * %d = %d\n", x, y, multiply());
}
ВЫХОД Я ОЖИДАЮ:
Я ожидаю, что он запустит умножение, которое должно правильно рассчитать произведение двух, а затем распечатать следующее
34 * 47 = 1598
РЕЗУЛЬТАТ Я ПОЛУЧИЛ:
None. Когда я запускаю его из команды оболочки, я получаю сообщение о том, что
Shell command executed with no output
МОЯ ПРОБЛЕМА:
При запуске gcc -m32 main.c multiply.s
появляется сообщение об ошибке
.
gcc -m32 multiply.s main.c
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in _multiply from /var/folders/ct/6_dmqq_11s9951v72wbcx06m0000gn/T//cc9DcDxr.o. To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
Он генерирует файл a.out, и когда я запускаю файл a.out из оболочки, он дает мне это
(Shell Command succeeded with no output)
Идеи
Вот мой код:
.globl _multiply
_multiply:
.data
.globl _x
.globl _y
_prod: .long 0
_x: .long 0
_y: .long 0
pushl %ebp
movl %ebp,%esp
movl _x,%eax
movl _y,%edx
movl $1,%ecx
LOOP:
cmpl $0,%eax
je DONE
and %eax,%ecx
cmp $0,%ecx
je CONTINUE
add %edx,_prod
CONTINUE:
shrl $1,%eax
shll $1,%edx
jmp LOOP
DONE:
movl _prod,%eax
popl %ebp
ret