簡體   English   中英

x86匯編極限新手查詢:“指令操作數無效”?

[英]x86 assembly extreme novice inquiry: “invalid instruction operands”?

下面的代碼只是我目前嘗試編寫的程序的一小部分,但程序的其他部分沒有相關性,所以我只粘貼了必要的部分。 無論如何,我想要做的是將 inputLoopCounter 中存儲的值移動到 ecx 中,以確定循環應該執行多少次。 但是,當我嘗試組裝這個程序時,我收到了問題標題中提到的錯誤。 任何人都可以解釋原因嗎?

.data
inputLoopCounter BYTE -1

.code
mov   ecx,inputLoopCounter

一種可能的解決方案是用inputLoopCounter DWORD -1替換inputLoopCounter BYTE -1 inputLoopCounter DWORD -1

在 MASM 中, foo BYTE -1被視為聲明具有固定大小的“變量”。 稍后使用該符號意味着訪問它的指令的操作數大小。

因此,MASM 試圖讓您遠離自己,阻止您從 1 字節變量執行雙字(4 字節)加載。 即使您有多個字節,例如foo db "foobar"並且想要加載多個字符,也會發生這種情況; 這就是mov eax, dword ptr [foo]很有用的時候。

英特爾語法匯編語言 (NASM) 的另一種主要風格將很高興地組裝一條從[inputLoopCounter]加載 4B 的指令,而不管inputLoopCounter是什么標簽。

在 NASM 中, mov [inputLoopCounter], 0是一個語法錯誤,因為任何一個操作數都沒有隱含的操作數大小。 (在 MASM 中,它將是一個mov byte ptr [inputLoopCounter], 0 。)


半相關: MASM32 中的混淆括號- foo ptr [123]作為ds:123的替代方法,用於指示內存操作數,而不是立即數,其中[123]仍然是立即數。 還相關: [var] 和 var 之間的程序集差異


如果 MASM 在數據部分允許它, foo: db ...將只聲明一個沒有隱含大小的標簽,與任何數據聲明分開。

但顯然 MASM 在數據部分支持它,所以你被變量困住了,除非你想切換匯編程序。 如何在匯編語言中定義雙字中存儲 4 個字符?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM