linux - 关于在 IA32 的 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 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

这会将 edx 寄存器加载到 countaddress,类似于 0x804912a。你不想写 0x804912a 字节。

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

    movzx edx, byte [count]

更改后,您的程序将按预期运行。

关于linux - 关于在 IA32 的 NASM 程序集中逐字符解析字符串的调试代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36087846/

相关文章:

python - 将 NFC 键盘通过管道传输到树莓派上的 python 脚本

c++ - 在 Netbeans 中调试 C++

c++ - C 中的函数序言和结语

assembly - 'h' 后缀是什么意思?

assembly - 释放 x87 FPU 堆栈 (ia32)

linux - 有什么办法可以将 .glade 文件转换为可执行文件吗?

c - Linux mremap 没有释放旧映射?

regex - 使用 sed,识别文本文件中的正确行并将三个不同部分写入单独的变量

java - 安卓工作室/JAVA : How to trace error at android studio using "log"

c++ - Release模式下只执行部分代码