gpt4 book ai didi

linux - 如何在汇编程序中打开文件并修改它?

转载 作者:IT王子 更新时间:2023-10-29 00:48:12 24 4
gpt4 key购买 nike

我开始学习汇编程序,并且在 Unix 中工作。我想打开一个文件并在上面写上“Hello world”。

section .data

textoutput db 'Hello world!', 10
lentext equ $ - textoutput
filetoopen db 'hi.txt'

section .text
global _start

_start:

mov eax, 5 ;open
mov ebx, filetoopen
mov ecx, 2 ;read and write mode
int 80h

mov eax, 4
mov ebx, filetoopen ;I'm not sure what do i have to put here, what is the "file descriptor"?
mov ecx, textoutput
mov edx, lentext

mov eax, 1
mov ebx, 0
int 80h ; finish without errors

但是当我编译它时,它什么也没做。我究竟做错了什么?当我打开一个文件时,文件描述符值返回到哪里?

最佳答案

这是 x86 Linux(x86 不是唯一的汇编语言,Linux 也不是唯一的 Unix!)...

section .data

textoutput db 'Hello world!', 10
lentext equ $ - textoutput
filetoopen db 'hi.txt'

文件名字符串需要一个 0 字节的终止符:filetoopen db 'hi.txt', 0

section .text
global _start

_start:

mov eax, 5 ;open
mov ebx, filetoopen
mov ecx, 2 ;read and write mode

2open 系统调用的 O_RDWR 标志。如果您希望在文件不存在时创建该文件,您还需要 O_CREAT 标志;如果指定 O_CREAT,则需要第三个参数,即文件的权限模式。如果您查看 C header ,您会发现 O_CREAT 被定义为 0100 - 请注意前导零:这是一个八进制常量!您可以使用 o 后缀在 nasm 中编写八进制常量。

所以你需要像 mov ecx, 0102o 这样的东西来获得正确的标志和 mov edx, 0666o 来设置权限。

int 80h

系统调用的返回码在 eax 中传递。在这里,这将是文件描述符(如果打开成功)或一个小的负数,这是一个负的 errno 代码(例如 -1 表示 EPERM)。请注意,从原始系统调用返回错误代码的约定与 C 系统调用包装器(通常返回 -1 并设置 errno 在错误的情况下)...

mov eax, 4
mov ebx, filetoopen ;I'm not sure what do i have to put here, what is the "file descriptor"?

...所以这里你需要先mov ebx, eax(在eax被覆盖之前保存open结果)然后mov eax, 4。 (您可能需要考虑先检查结果是否为正,如果不是,则以某种方式处理打开失败。)

mov ecx, textoutput
mov edx, lentext

此处缺少 int 80h

mov eax, 1
mov ebx, 0
int 80h ; finish without errors

关于linux - 如何在汇编程序中打开文件并修改它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8312290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com