我正在尝试学习装配,而在试用教程中的例子时我会陷入困境。我正在使用ubuntu虚拟机编译它。
以下是代码:
SYS_READ equ 3
SYS_WRITE equ 4
SYS_OPEN equ 5
SYS_CLOSE equ 6
SYS_CREATE equ 8
SYS_EXIT equ 1
section .text
global _start
_start:
mov eax, SYS_CREATE
mov ebx, filename
mov ecx, 0777
int 0x80
mov [fd_out],ebx
mov eax,SYS_WRITE
mov edx,len
mov ecx,msg
mov ebx,[fd_out]
int 0x80
mov eax,SYS_CLOSE
mov ebx,[fd_out]
int 80h
mov eax,SYS_OPEN
mov ebx,filename
mov ecx,0
mov edx,0777
int 0x80
mov [fd_in],eax
mov eax, SYS_READ
mov ebx,[fd_in]
mov ecx,info
mov edx,26
int 0x80
mov eax,SYS_WRITE
mov ebx,1
mov ecx,info
mov edx,26
int 0x80
mov eax,SYS_EXIT
mov ebx,0
int 0x80
section .data
filename db 'test.txt'
msg db 'Hello world file'
len equ $-msg
section .bss
fd_out resb 1
fd_in resb 1
info resb 26
执行编译后的输出后,我得到一个名为 test.txtHello world file 的文件。
答案 0 :(得分:2)
虽然SYS_WRITE接受EDX中信息的长度,但SYS_CREATE函数需要一个指向文本名称的NULL终止字符串的指针。
您的文件名,定义为
filename db 'test.txt'
不是NULL终止,这就是它与下一个字符串连接的原因:
msg db 'Hello world file'
在这种情况下,终止NULL是下一个定义的:
fd_out resb 1
为了解决这个问题,只需使用零终止字节定义文件名:
filename db 'test.txt', 0