assembly 将两个字符串写入控制台不工作

uz75evzq  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(101)

我是x_86汇编语言的新手,正在尝试向控制台写一些简单的东西。
当我尝试这个:

section .data
        str: db "0000", 0xA
        len: db 5

    global _start

    section .text
    _start:
        ; system call to print the string
        mov eax, 4  ; "write" system call
        mov ebx, 1  ; Indicates to write to standard out
        mov ecx, str    ; The string
        mov edx, [len]  ; The length of the string
        int 0x80

        ; exit the program
        mov eax, 1
        mov ebx, 0
        int 0x80

它工作正常,并打印出“0000”。但如果我再试试这个:

section .data
        str: db "0000", 0xA
        len: db 5
        otherStr: db "1111", 0xA
        otherLen: db 5

    global _start

    section .text
    _start:
        ; system call to print the string
        mov eax, 4  ; "write" system call
        mov ebx, 1  ; Indicates to write to standard out
        mov ecx, str    ; The string
        mov edx, [len]  ; The length of the string
        int 0x80

        ; system call to print the string
        mov eax, 4  ; "write" system call
        mov ebx, 1  ; Indicates to write to standard out
        mov ecx, otherStr   ; The string
        mov edx, [otherLen]     ; The length of the string
        int 0x80

        ; exit the program
        mov eax, 1
        mov ebx, 0
        int 0x80

它输出了所有这些令人费解的东西:

0000
    1111
        
    (#
    /
        6
        sha.asmstrlenotherStrotherLen__bss_start_edata_end.symtab.strtab.shstrtab.text.dat:! 
                                                                                                    ;!'1111

我期望的输出只是:
0000
1111
我做错了什么?这是在Fedora Linux上使用NASM汇编器。我用来链接和组装的命令如下:

nasm -f elf32 example.asm -o ex1.o
ld -m elf_i386 ex1.o -o ex1
8gsdolmq

8gsdolmq1#

len是这样定义的

len: db 5

这本身就很好。
它是这样加载的:

mov edx, [len]

这本身也很好。
但他们合在一起就错了。加载加载了一个DWORD,只有一个字节专用于变量,所以加载了3个额外的字节,它们是“其他东西”。在第一个程序中,它们是从“零填充”中的零,以将数据部分填充到页面大小的倍数。在第二个程序中,它们不是零。
您可以使长度(两者)DWORD(例如len: dd 5)或加载零扩展,例如movzx edx, byte [len]

相关问题