Пожалуйста, поправьте меня, если я ошибаюсь:
В ассемблере 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 изменил порядок источника и назначения для инструкций с двумя входами.
т.е. АТ&Т это:
movl <source>, <dest>
в то время как в синтаксисе Intel это будет:
mov <dest>, <source>
Любые исправления приветствуются, так как я все еще учусь.
person
Hawken
schedule
27.03.2012
int 21h
не будет работать, даже если он переведен на синтаксис AT&T. - person user786653   schedule 18.11.2011