Маскированный ввод сборки AT&T

Я пытаюсь создать простую программу паролей в AT&T Assembly, но у меня проблемы с маскировкой ввода. Я хочу, чтобы когда пользователь вводит символы, они отображались на экране в виде звездочки. В синтаксисе Intel это относительно просто:

mov ah, 08h
int 21h

mov dl,2ah
mov ah,02h
int 21h

Это использует команду intel для чтения ввода без его повторения и вместо этого печатает звездочку. Я пытаюсь решить эту проблему с помощью синтаксиса AT&T, и у меня возникают проблемы.

Мы будем очень признательны за любой вклад. Заранее спасибо.


person TheoVate    schedule 18.11.2011    source источник
comment
Какую цепочку инструментов вы используете? Если вы находитесь под, например. Linux int 21h не будет работать, даже если он переведен на синтаксис AT&T.   -  person user786653    schedule 18.11.2011
comment
Нет, я использую int 0x80, код работает. У меня только что возникли проблемы с поиском системного вызова read no echo в at&t   -  person TheoVate    schedule 18.11.2011
comment
Это потому, что это зависит от платформы. Вы должны указать точную платформу, на которой вы работаете, например. 32-битный x86 линукс. Ответ будет таким же, как и для C/C++/etc. и, вероятно, будет включать tcsetattr. См., например. этот ТАК вопрос.   -  person user786653    schedule 18.11.2011
comment
Я использую as-компилятор на linux x86 с синтаксисом AT%T, если это поможет.   -  person TheoVate    schedule 11.12.2011
comment
Что именно у вас затруднено? Создание программы сборки? Чтение ввода из этой программы? Это просто ввод с клавиатуры без эха?   -  person user786653    schedule 13.12.2011
comment
Просто получая ввод без эха, я пытался исследовать его как мог, но в итоге это оказалось решением Intel. Так что мне просто нужна версия AT&T приведенного выше кода Intel. Или решение, которое делает то же самое. Только в AT&T. Спасибо за ответы.   -  person TheoVate    schedule 14.12.2011


Ответы (1)


Пожалуйста, поправьте меня, если я ошибаюсь:

В ассемблере 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