あなたが見ている場合、byte ptr
とword ptr
はあまり達成していません。無害ですが、アセンブラはすでにそれを「認識」してal
おりdl
、バイトサイズであり、bx
ワードサイズです。
byte ptr
(たとえば)即値を間接アドレスに移動する場合のようなものが必要です。
mov bx, some offset
mov [bx], 1
1
これは通常は許可されません。アセンブラは、バイト、ワード、ダブルワード、場合によってはクアッドワード、または何に書き込むかを知る方法がありません。サイズ指定を使用して修正します。
mov byte ptr [bx], 1 ; write 1 into a byte
mov word ptr [bx], 1 ; write 1 into a word
mov dword ptr [bx], 1 ; write 1 into a dword
(直接)サイズ指定のないバージョンをアセンブラーに受け入れさせることができます。
mov bx, some_offset
assume bx: ptr byte
mov [bx], 1 ; Thanks to the `assume`, this means `byte ptr [bx]`
編集:(主に@NikolaiNFettisovに返信するため)。このクイックテストを試してください:
#include <iostream>
int test() {
char bytes[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
_asm mov eax, dword ptr bytes + 1
}
int main() {
std::cout << std::hex << test();
return 0;
}
私が得る結果は次のとおりです。
5040302
私が言ったとしてもdword ptr
、アドレスには4ではなく1しか追加されていないことを示しています。もちろん、別のアセンブラを作成している人は、選択すれば別の方法でそれを行うことができます。