我是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
1条答案
按热度按时间8gsdolmq1#
len
是这样定义的这本身就很好。
它是这样加载的:
这本身也很好。
但他们合在一起就错了。加载加载了一个DWORD,只有一个字节专用于变量,所以加载了3个额外的字节,它们是“其他东西”。在第一个程序中,它们是从“零填充”中的零,以将数据部分填充到页面大小的倍数。在第二个程序中,它们不是零。
您可以使长度(两者)DWORD(例如
len: dd 5
)或加载零扩展,例如movzx edx, byte [len]
。