Assembly 为什么这个汇编程序不能正常工作?

Assembly 为什么这个汇编程序不能正常工作?,assembly,x86,Assembly,X86,我试图生成一个简单的x86汇编代码,它从用户那里获取输入,然后将其与内存中的硬编码密码进行匹配,并相应地向用户打印一条正确/不正确的消息 这是我的密码: %macro write_string 2 mov eax, 4 mov ebx, 1 mov ecx, %1 mov edx, %2 int 80h %endmacro %macro read_string 2 mov eax, 3 mov ebx, 0

我试图生成一个简单的x86汇编代码,它从用户那里获取输入,然后将其与内存中的硬编码密码进行匹配,并相应地向用户打印一条正确/不正确的消息

这是我的密码:

%macro write_string 2 
    mov   eax, 4
    mov   ebx, 1
    mov   ecx, %1
    mov   edx, %2
    int   80h
%endmacro

%macro read_string 2
    mov eax, 3
    mov ebx, 0
    mov ecx, %1
    mov edx, %2
    int 80h
%endmacro

section .text
    global _start

_start:
    write_string msg, lenMsg

    read_string string, 32

    mov [readBytes], eax

    mov ecx, 0
    l1:
        mov eax, string
        add eax, ecx

        mov byte al, [eax]

        mov eax, pwd
        add eax, ecx

        mov byte bl, [eax]

        cmp bl, al
        jne incorrect
        inc ecx
        cmp ecx, [readBytes]
        jne l1

    correct:
        write_string txt1, txt1Len
        jmp exit

    incorrect:
        write_string txt2, txt2Len

    exit:
        write_string lineBreak, 1
        mov eax,1
        int 0x80



section .bss
    readBytes: resb   1

section .data

msg db 'Password: '
lenMsg equ $ - msg

string times 100 db 0

pwd  db 'secretPass1'

txt1 db 'Correct', 0xa
txt1Len equ $ - txt1
txt2 db 'Incorrect', 0xa
txt2Len equ $ - txt2

lineBreak db 0xa
程序可以编译,但当我运行它并键入输入时,它总是打印不正确的消息,即使我使用了正确的密码

你能告诉我我做错了什么吗

我还有一个问题,这两者的区别是什么:

section .bss
    string: resb   100
以及:

用于分配未初始化的数据

谢谢

同样,将地址加载到pwd会覆盖AL寄存器中已加载的字符。 您可以通过使用不同的寄存器遍历pwd来解决此问题,也可以通过使用不同的寻址模式来更正它并简化代码:

  mov [readBytes], eax
  xor ecx, ecx
Verify:
  mov dl, [string + ecx]
  mov bl, [pwd + ecx]
  cmp dl, bl
  jne incorrect
  inc ecx
  cmp ecx, eax            ; No need to compare with a memory based variable
  jb  Verify
还有其他问题:

在.bss中,您为readBytes变量保留了1个字节,该变量实际上是一个dword,因此需要4个字节的存储空间。因为您在.bss中只使用了一个变量,所以现在不会注意到错误,而是等到您必须编写一个包含更多变量的程序

您的密码验证循环在所有输入的字符上运行,忽略了这样一个事实,即如果输入比存储的密码长或短(包括空),则比较字符是无效的

    mov [readBytes], eax
    cmp eax, 11          ; Length of the hardcode password 'secretPass1'
    jne incorrect
    xor ecx, ecx
  Verify:
resb 100.bss与乘以100 db 0.data之间的差值

由汇编程序执行100 db 0的次数。它会在可执行文件中实际放入这么多零字节。保证内存将包含100个零字节。
当程序启动时,操作系统“执行”resb 100。很多时候,这个内存也会包含零字节,但我们的想法是,你不应该指望这是真的。

你能告诉我我做错了什么吗?您甚至还没有告诉我们运行时出现了什么问题。读取字符串后readBytes的值是多少?@Michael我相信这是用户输入的字符串的长度。关键是,如果您所有的假设都是正确的,您不会有任何问题。但是,由于确实存在问题,您应该验证所有内容,readBytes和string的内容将是一个很好的开始。mov byte al,[eax]将寄存器al设置为输入字节。然而,mov eax,pwd随后覆盖al,因为al是eax的低8位。
  mov [readBytes], eax
  xor ecx, ecx
Verify:
  mov dl, [string + ecx]
  mov bl, [pwd + ecx]
  cmp dl, bl
  jne incorrect
  inc ecx
  cmp ecx, eax            ; No need to compare with a memory based variable
  jb  Verify
    mov [readBytes], eax
    cmp eax, 11          ; Length of the hardcode password 'secretPass1'
    jne incorrect
    xor ecx, ecx
  Verify: