Пожалуйста, исправьте меня, если я ошибаюсь:
В сборке AT & T шестнадцатеричный код написан в стиле C: 0x30
вместо 30h
.Восьмеричные также похожи на C, с префиксом 0
.
. И в зависимости от того, каким размером памяти вы манипулируете, вы должны использовать постфикс этого размера в операнде.Это означает movl
вместо mov
в 32-битной памяти:
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 изменилсяпорядок назначения-источника для инструкций с двумя входами.
Т.е. AT & T:
movl <source>, <dest>
, а в синтаксисе Intel это будет:
mov <dest>, <source>
Любые исправления приветствуютсякак я все еще учусь.