2011-02-23 58 views
1

我想將字節數組(或指向該數組的指針)傳遞給8086程序集中的函數。數組作爲8086程序集中函數的參數

當我嘗試PUSH那個指針時,它給我一個編譯錯誤。錯誤是「錯誤的參數」。

org 100h 

JMP Start 

Donnee DB 0ABh,0CDh,0EFh 

;; Principal program ;; 
Start: 

PUSH Donnee 

CALL CalculeCRC 

POP CRC 

ret 
+0

正如我敢肯定你明白,這是相當有幫助的,包括實際當您嘗試組裝此程序時,您也會收到錯誤消息。 – unwind 2011-02-23 14:53:12

+0

消息是錯誤的並不是真的有幫助。不過,我編輯了我的問題。 – gcamp 2011-02-23 14:56:40

回答

2

PUSH操作碼需要一個DWORD值,無論是在內存還是寄存器中。在你的情況下,你試圖推送一個三字節的數組。從技術上講,我認爲這是有效的代碼,但彙編程序認識到它並不是真的想要你想要的。 (如果你在你的字節數組中添加了另一個元素,它可能會感興趣的看看代碼是否會組裝起來,但這不是重點)。

無論如何,你要做的不是你想要發生的事情。在你調用你的函數之前,你想把指向數組的指針推入堆棧,而不是試圖將整個數組推入堆棧。即使彙編程序讓你這樣做會很糟糕,因爲這會浪費內存。爲了做你想做的事情,你需要得到你的數組的地址並將它推入堆棧。您可以使用LEA獲得數組的「有效地址」:

lea eax, Donnee 
push eax 

可以做到以下幾點:

push OFFSET Donnee 
+0

很好的答案,謝謝。 – gcamp 2011-02-23 15:12:43

+0

請注意,PUSH immed需要80186或更高版本(或NEC V20等兼容產品)。在原來的8086指令集中不可用。 – 2011-02-23 15:46:38

0

我當然不是8086的專家,但我會閱讀PUSH指令,看看它是否真的可以做你期望的。

從一個非常快速的檢查,我認爲它需要一個寄存器,所以你需要首先加載地址到一個寄存器,然後推入寄存器。

也許是這樣的:

lea ax, Donnee 
push ax 

有可能是標點符號和/或參數排序錯誤在這裏;我沒有8086彙編程序。

+0

工作,謝謝。問題不在於PUSH需要一個寄存器,而是它將8位值調整爲堆棧,並且堆棧需要16位值。使用LEA允許查找數組的16位地址。 – gcamp 2011-02-23 15:01:09