以下是我的匯編代碼:
mov esi, MemberLvl
mov edi, OfficerLst
mov al, [esi]
mov test1, al
mov ah, [edi]
mov test2, ah
在 C 主程式中,我宣告了一個名為 MemberLvl 和 OfficerLst 的 long 型別串列,以及兩個 long 型別 - test1 和 test1。
每當我嘗試運行我的代碼時,它總是說與mov test1、al 和mov test2 存在運算元大小沖突,啊
我的想法是每個陣列都存盤在esi和edi中。然后我通過獲取它們的第一個記憶體地址將第一個元素存盤到 al 或 ah 中。因為每個 long 是 8 個位元組,而 al 或 ah 暫存器是 8 個位元組,所以我認為它將能夠將其存盤到 test1 和 test2 (它們都被宣告為 long,8 個位元組),但事實并非如此。我不確定為什么會這樣。
uj5u.com熱心網友回復:
al并且ah是8 位值(1 個位元組)。test1并且test2根據您的“長”,它是 32 位(4 位元組)或 64 位(8 位元組),具體取決于您的編譯器/系統。
如果要將值存盤在各個變數中,可以使用movzx(如果無符號)或movsx(如果有符號)。
另外,請注意,如果MemberLvl是 a long,則將其移動到esi,然后做[esi]可能是未定義的行為,除非MemberLvl碰巧包含有效的指標地址。如果MemberLvl是 a long *,那么它可能沒問題,但 then[esi]是 32 位或 64 位值,因此您不應該使用al或根本不應該使用ah。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/457295.html
上一篇:從未選擇實體化的默認概念約束函式
下一篇:從bson轉換的json沒有轉儲
