AT&T 组装屏蔽输入
Posted
技术标签:
【中文标题】AT&T 组装屏蔽输入【英文标题】:AT&T Assembly Masked Input 【发布时间】:2011-11-18 12:08:08 【问题描述】:我正在尝试在 AT&T Assembly 中创建一个简单的密码程序,但在屏蔽输入时遇到了问题。我想要发生的是当用户输入字符时,它们在屏幕上显示为星号'。在 intel 语法中它相对简单:
mov ah, 08h
int 21h
mov dl,2ah
mov ah,02h
int 21h
这使用 intel 命令读取输入而不回显它,而是打印一个星号。 我正在尝试用 AT&T 语法解决这个问题,但遇到了一些麻烦。
任何意见将不胜感激。 提前致谢。
【问题讨论】:
你用的是什么工具链?如果你在例如Linuxint 21h
即使翻译成 AT&T 语法也无法工作。
不,我使用的是 int 0x80,代码运行。我只是在 at&t 中找不到 read no echo 系统调用
那是因为它是特定于平台的。您应该包括您正在运行的确切平台,例如32 位 x86 Linux。答案将与 C/C++/etc 相同。并且可能会涉及 tcsetattr。参见例如this所以问题。
我在 Linux x86 上使用 AT%T 语法的“as”编译器,如果有帮助的话。
您到底在做什么?创建一个汇编程序?从那个程序读取输入?只是在没有回声的情况下获得键盘输入吗?
【参考方案1】:
如果我错了,请纠正我:
在 AT&T 汇编中,十六进制写成 C 风格:0x30
而不是 30h
。八进制也与 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 语法已经反转了具有两个输入的指令的源-目标顺序。
即美国电话电报公司是:
movl <source>, <dest>
在英特尔语法中,这将是:
mov <dest>, <source>
欢迎大家指正,因为我还在学习中。
【讨论】:
以上是关于AT&T 组装屏蔽输入的主要内容,如果未能解决你的问题,请参考以下文章