0

我正在尝试在 AT&T Assembly 中创建一个简单的密码程序,但我在屏蔽输入时遇到了麻烦。我想要发生的是当用户输入字符时,它们在屏幕上显示为星号'。在 intel 语法中它相对简单:

mov ah, 08h
int 21h

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

这使用 intel 命令读取输入而不回显它,而是打印一个星号。我正在尝试用 AT&T 语法解决这个问题,但遇到了一些麻烦。

任何投入将不胜感激。提前致谢。

4

1 回答 1

0

如果我错了,请纠正我:

在 AT&T 汇编中,十六进制写成 C-style: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>

而在英特尔语法中,这将是:

mov <dest>, <source>

欢迎任何更正,因为我还在学习。

于 2012-03-27T01:13:29.407 回答