[英]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.