我正在尝试在 AT&T Assembly 中创建一个简单的密码程序,但我在屏蔽输入时遇到了麻烦。我想要发生的是当用户输入字符时,它们在屏幕上显示为星号'。在 intel 语法中它相对简单:
mov ah, 08h
int 21h
mov dl,2ah
mov ah,02h
int 21h
这使用 intel 命令读取输入而不回显它,而是打印一个星号。我正在尝试用 AT&T 语法解决这个问题,但遇到了一些麻烦。
任何投入将不胜感激。提前致谢。
如果我错了,请纠正我:
在 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>
欢迎任何更正,因为我还在学习。