[解決済み] error A2022: 命令オペランドは同じサイズでなければなりません。
2022-01-29 20:19:11
質問
このコードを実行すると、次のようなエラーが発生します。
1>------ Build started: Project: Project, Configuration: Debug Win32 ------
1> Assembling [Inputs]...
1>assign2.asm(32): error A2022: instruction operands must be the same size
1>assign2.asm(33): error A2022: instruction operands must be the same size
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\masm.targets(49,5):
error MSB3721: The command "ml.exe /c /nologo /Zi /Fo"Debug\assign2.obj" /Fl"Project.lst"
/I "c:\Irvine" /W3 /errorReport:prompt /Taassign2.asm" exited with code 1.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
以下のコードは、usPopからml1337skillzを引き、その結果をDifferenceに格納しようとしたときに起こります。 (私はこの分野を学び始めたばかりであることを心に留めておいてください :))
TITLE Learning (learning.asm)
INCLUDE Irvine32.inc
secondE = 00000000010001010000000000000000b
.data
myName BYTE "John Smith"
nameLen = ($ - myName)
nationalDebt QWORD 7975482431119.47d
usPop DWORD 313900000d
kindaNegative SDWORD -2147483648d
my1337Sk1LLz WORD 1337h
negUnit SBYTE -1
half BYTE 0.5d
Difference SWORD ?
starField BYTE 2000 DUP("*")
bigLoss SDWORD -50000
.code
main PROC
FillRegs:
mov eax,usPop ;store 3139000000d into eax
sub eax,my1337Sk1LLz ;subtracts 1337h from usPop in eax
mov Difference, eax ;stores eax into Difference
mov edx,bigLoss ;stores -50000 into edx
mov eax,secondE ;store 0E00 into eax
mov ah,'A' ;store string A into ah
mov al,'X' ;store string X into al
mov ebx,secondE ;store 0E00 into ebx
mov bh,'B' ;store string B into bh
mov bl,'X' ;store string X into bl
call DumpRegs ;shows Registers
exit ;exits
main ENDP
END main
解決方法は?
この2行があなたの問題です。
sub eax,my1337Sk1LLz ;subtracts 1337h from usPop in eax
mov Difference, eax ;stores eax into Difference
eax
は32ビットですが、どちらも
my1337Sk1LLz
と
Difference
は16ビットです。
これを回避する方法は2つあります。
-
のサイズを変更する
my1337Sk1LLz
とDifference
. 今、あなたが持っているタイプはWORD
とSWORD
それぞれ これらをDWORD
とSDWORD
を使用して32ビット化します。 -
ゼロ伸長と切り捨て。 別のレジスターが必要です。使うのは
edx
そこでは使っていないようなので まず、サインエクステンドでmy1337Sk1LLz
:movzx edx, my1337Sk1LLz ; move, zero-extended, my1337Sk1LLz into EDX
そうすると、引き算ができるようになります。
sub eax, edx ; they're the same size now so we can do this
そして、その下位ワードに
eax
をDifference
で、上位の単語は破棄されます。mov Difference, ax
関連
-
[解決済み】テスト %eax %eax のポイント【重複あり
-
[解決済み] テスト
-
[解決済み] MIPSの左シフト
-
[解決済み] オブジェクトファイルのシンボルテーブルとリロケーションテーブル
-
[解決済み] movsbl 命令は何をするのですか?重複
-
[解決済み] SRLとSRAの違いは何ですか?[重複しています]。
-
[解決済み] アセンブリMIPS .ALIGNとメモリアドレスの理解
-
[解決済み] テストのポイント %eax %eax [重複]。
-
[解決済み] objdumpの出力にあるdata16とはどういう意味ですか?
-
[解決済み] MIPSのオペコードにおけるlaとliの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】andiとoriはこのプログラムで何をするのですか?
-
[解決済み】なぜMIPS用のsubiオペコードは存在しないのですか?
-
[解決済み】x86アセンブリ。AT&Tの構文で「subl」コマンドはどのように動作するのか
-
[解決済み] テスト
-
[解決済み] MIPSの左シフト
-
[解決済み] MIPSプログラムの中で`lw`と`sw`が実際にどのように機能するかを理解する
-
[解決済み] アセンブリで命令セテは何をするのですか?
-
[解決済み] MIPS:lw(ロードワード)命令
-
[解決済み] x86アセンブリでレジスタに使用されるpush/pop命令の機能は何ですか?
-
[解決済み] MIPSプログラムにおける`lw`と`sw`の実際の働きを理解する。