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