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 语法解决这个问题,但遇到了一些麻烦。

任何意见将不胜感激。 提前致谢。

【问题讨论】:

你用的是什么工具链?如果你在例如Linux int 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 组装屏蔽输入的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery 创建屏蔽输入?

at&t 汇编代码 ebp 注册未定义行为

电子邮件屏蔽的正则表达式

屏蔽右键+f12

jQuery屏蔽输入-取消屏蔽函数

shell run 屏蔽一切log