Linux 关于在IA32的NASM程序集中逐个字符解析字符串的调试代码

Linux 关于在IA32的NASM程序集中逐个字符解析字符串的调试代码,linux,debugging,assembly,x86,nasm,Linux,Debugging,Assembly,X86,Nasm,我是汇编编程的新手。我偶然发现了一个程序,其中要求我编写一个代码,从用户那里获取一个字符串和一个数字,并按给定的数字递增字符串中的每个字符 我已经做了以下工作:- section .bss s2 resb 20 ;output string s1 resb 20 ;input string num resb 2 ;input number count resb 1 ;length of the input str

我是汇编编程的新手。我偶然发现了一个程序,其中要求我编写一个代码,从用户那里获取一个字符串和一个数字,并按给定的数字递增字符串中的每个字符

我已经做了以下工作:-

    section .bss
        s2 resb 20   ;output string
        s1 resb 20   ;input string
        num resb 2   ;input number
        count resb 1 ;length of the input string
    section .data

    section .text
        global _start
    _start:
        mov eax,3      ;taking input string from the user
        mov ebx,0
        mov ecx,s1
        mov edx,20
        int 0x80

        mov eax,3     ;taking input number from user
        mov ebx,0
        mov ecx,num
        mov edx,2
        int 0x80

        mov al,'1'     ;initializing count to 1
        sub al,'0'
        mov [count],al

        mov ecx,20     ;no of times the loop can execute
        mov esi,s1     ;to use movsb on s1 and s2
        mov edi,s2

        mov bl,[num]     ;converting string num to integer
        sub bl,'0'

        loop1:      ;parse the string character by character
        lodsb 
        cmp al,00   ;exit out when encounter end_of_file
        je _exit
        add al,bl
        stosb
        inc byte [count]    ;increament count for every possible character except end_of file
        loop loop1

    _exit:
        cld
        rep movsb
        mov edx,count
        mov ecx,s2
        mov ebx,1
        mov eax,4
        int 0x80

        mov eax,1
        int 0x80
当我运行代码时,它会产生预期的输出和一些乱七八糟的字符。 我无法理解代码的问题。

接近尾声时:

    mov edx,count
这将加载地址为
count
edx
寄存器,该地址类似于0x804912a。您不想写入0x804912a字节

您希望
edx
加载
count
的内容。请注意,
count
是一个字节,而
edx
是一个32位寄存器,因此您需要对其进行零扩展。您可能希望将该指令替换为

    movzx edx, byte [count]
更改后,您的程序将按预期工作