2011-10-13 99 views
2

所以我要運行彙編代碼家庭作業的問題。該代碼應該只是簡單的乘法,但它不能使用imul函數或任何簡單的那樣,它必須使用移位。彙編語言乘法問題

一定有什麼錯誤的彙編代碼,因爲當我有emacs的編譯和運行的main.c和multiply.s,而不必main.c中實際調用多重功能,它輸出就好了。在另一方面,當我把它稱之爲多重功能,它迫使它不具有輸出

INPUT我有:

我期待我的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()); 
} 

OUTPUT我期望: 我希望它乘法運行,應該正確地計算兩者的產品,然後打印出以下

34 * 47 = 1598 

輸出I GET:

沒有。我得到一個消息,當我從shell命令說

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 

它產生的一個。 out文件,當我從shell運行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 
+0

您使用的是什麼操作系統/系統/彙編程序? –

+0

我正在使用一個mac,我使用的是AT&T語法 – NONE

回答

2

你得到的錯誤似乎與使用絕對地址。避免

一種方式是到堆棧(你正在設置爲該反正)在收到您的輸入,並在EAX返回結果。您應該能夠使用大約4個寄存器乘以兩個數字,而根本沒有其他存儲。

還要注意的是,現在它看起來像它的堆棧的使用是不匹配的。你有一個推動ebp的序言,但我沒有看到任何東西在返回之前彈出它。

+0

我修改了我的代碼,就像你說的那樣。仍然得到相同的錯誤。我現在在返回之前也會彈出ebp。仍然不起作用。 – NONE

+0

此外,我認爲這可能是獅子OSX的問題。我跑過這篇文章: http://caml.inria.fr/mantis/bug_view_advanced_pa​​ge.php?bug_id=5365 這似乎表明警告是由於某種原因不正確。 – NONE

+0

另外,我可以使用哪四個寄存器?我的教授告訴我不要使用ebx,因爲它會導致問題。 – NONE

1

首先,改善您的問題+1爲偉大的工作。

有幾件事情,我可以看到:

_multiply: 
.data 
    .globl _x 
    .globl _y 

_prod: .long 0 
_x: .long 0 
_y: .long 0 
pushl %ebp 

在這裏,我們在你的函數定義的數據。也就是說,不是在你的函數開始有說明你有一大堆的數據(其中,當解釋爲指令不會表現得很好)。移動數據了,(要切換回文本段的代碼通知)是這樣的:

.data 
_x: .long 0 
_y: .long 0 
.text 
_multiply: 
pushl %ebp 

另外:

movl %ebp,%esp 

幾乎可以肯定不是你想要的,因爲你正在移動覆蓋堆棧指針,其內容爲%ebp。修改成:

movl %esp,%ebp 

(AT & T語法可能會造成混淆,你可以考慮使用.intel_syntax prefix但是這意味着改變所有的代碼)。

你的乘法功能也將無法正常工作第一(你覆蓋你以後指望值),但第一件事情:)

PS:你也應該把return 0;main函數結束。

+0

完美!解決了問題!真正的關鍵是movl%esp,%ebp。在你回答之前,我實際上已經明白了這一點,並且我終於得到了一些結果。之後,對於實際的算法很容易解決。再次感謝!!! – NONE

+0

@NONE:很高興你的工作,但你不應該刪除你的問題,因爲每個人在未來看到它會感到困惑。我已回滾您的修改。 – user786653