私が間違っている場合は修正してください:
AT&T アセンブリでは、16 進数は C スタイルで書かれています:0x30
の代わりに30h
. 8 進数も C と同様で、接頭辞として0
.
また、操作するメモリのサイズに応じて、オペランドでそのサイズの接尾辞を使用する必要があります。つまり、32 ビットの長いメモリmovl
ではなく、次のようになります。mov
8 bits = b - derived from "byte"
16 bits = w - derived from "word"
32 bits = l - I have no idea why 16 bits is usually a "dword"
64 bits = q - derived from "qword", q for "quad-", so four words in size
また、値にはドル記号の接頭辞が付きます: $0x41
(変数と同様に?) レジスタにはパーセント記号の接頭辞が付いています: %eax
.
したがって、これを正しく読んでいる場合、コードは次のようになります。
movl $ah, $0x08
int 0x21
movl $dl, $2ah
movl $ah, $0x02
int $0x21
答えを書いたときにこれを見逃したとは信じられません。AT&T 構文では、2 つの入力を持つ命令のソースと宛先の順序が逆になっています。
つまり、AT&T は次のとおりです。
movl <source>, <dest>
一方、インテルの構文では次のようになります。
mov <dest>, <source>
私もまだ勉強中なので、修正は大歓迎です。