【问题标题】:Assembler - How to end writing a password with ENTER汇编程序 - 如何使用 ENTER 结束写入密码
【发布时间】:2021-06-02 14:51:38
【问题描述】:

我正在为汇编编程做作业,但我无法解决这个问题。 任务是编写一个程序,其中用户输入密码,控制台显示“*”而不是输入的字母。输入上述密码后,用户按 ENTER 键“设置”密码,并要求用户再次输入相同的密码以检查它是否与之前设置的相同。

我让这段代码工作,它读取击键,保存输入的密码,然后将其写入控制台。但我无法让它在按下 ENTER 时停止。 (现在只注册12个字母)

section .text
org 100h

xor si, si  
mov dl, '*'     

loop:               
    mov ah, 7           
    int 21h
    mov [letters+si], al        
        
    mov ah, 2           
    int 21h             
    inc si
    cmp si, 12
    jnz loop
    
xor si, si
write:
    mov dl, [letters+si]    
    int 21h         
    inc si
    cmp si, 12
    jnz write

end:
    mov ax, 4c00h 
    int 21h
    
section .bss
    letters resb 12

【问题讨论】:

  • 目前它似乎根本不包含任何甚至试图在 ENTER 上停止的代码。你尝试了什么?
  • 我根本不懂汇编程序,所以这就是我得到的,我尝试了一些来自互联网的解决方案。但是我遇到了错误或没有按预期工作。

标签: assembly windows-10 nasm dosbox


【解决方案1】:

(从书架上拿一本很旧、满是灰尘的书……)

mov ah, 7           
int 21h

这会从控制台读取一个字母(没有回显)到 al。之后您将其存储在您的字符串中。在这两行之后,在你存储 al 之前,你必须检查它是否是 enter 键。在 DOS 中,回车键由两个字符表示,一个回车符和一个换行符。您只对其中任何一个感兴趣,(但您不想存储它们)。回车是 0xd,换行是 0xa。所以你需要类似的东西

cmp al, 0dh
je endOfLoop; // place label before xor si, si

【讨论】:

  • 对不起,让你呼吸了那么多灰尘。我把这两行放在你说它们应该放在的地方,并在 xor 之前添加了标签。但是在写了 4-5 个字母并按 ENTER 后它不会显示密码,它正在等待我再次输入 12 个字母然后关闭而不显示任何内容。
  • 哦,你没有在写入后的 int 21h 命令之前设置 al。在while 标签之后插入mov ah, 2
  • 哦,知道了。还有一件事。 ENTER 的东西工作正常,但现在如果我设置的密码短于 12 个字母,它会写入我的密码 + 随机字母(例如,我将密码设置为 123456 并按 ENTER,它会读回“123456d7xc sd”)如何清除剩余的字符?
  • 在程序开始时运行另一个循环,将“字母”中的所有值设置为零。您可以使用 X86 架构中最强大的汇编命令之一来做到这一点:xor di, di; xor al, al; mov cx, 12; rep stosb;
  • @Reppumaru 要使rep stosb 工作,您需要将xor di, di 替换为mov di, letters。这将加载正确的地址。
猜你喜欢
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多