gpt4 book ai didi

linux - 打开一个 .ppm 文件并向其中写入一些数据。 AMD64 linux 汇编 Nasm

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:13 26 4
gpt4 key购买 nike

我正在用 AMD64 linux 汇编代码(汇编器 Nasm)编写一个程序,它可以做很多事情。基本上,我现在的问题是如何打开文件并向其中写入一些数据。

我的代码似乎应该可以工作。

基本上我想打开一个 .ppm 图像文件并将标题写入其中。我的教授给了我一些伪代码来帮助我,这里是我试图完成的部分的代码。

fd = open("gradient.ppm", 577, 0o644)
if fd < 0: return 1 (error)

bufsize = writeHeader(buffer, 256, 256)
status = write(fd, buffer, bufsize)
if status < 0: return 2 (error)

这是我的代码。我的教授有一些用 c++ 编写的测试程序,它将运行我的代码并测试它是否正常工作,所以我没有直接从这个文件运行。 (顺便说一句,writeheader 文件已被确认有效)

global start
extern writeRGB
extern writeHeader

section .data
filename: db "gradient.ppm",0

section .bss
buffer resb 5000

section .text
; rdi,rsi,rdx
start:

push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15

; open file
; sys_open: rax=2, rdi=char filename, rsi=int flags, rdx=int mode
mov rax, 2 ; 2 is system call number for sys_open
mov rdi, filename ; filname is in data section
mov rsi, 577 ; flag that is just given to me
mov rdx, 0o644 ; Octol number of the mode that is just given to me
syscall ; execute the sys_open system call
mov r9, rax ; r9 will hold file handle (fd)

; check for error
; compare 0 and data returned to rax from opening file.
; if data in rax < 0, store 1 in r11 and jump .error which will return the 1
mov r11, 1
cmp r9, 0
jl .error

; call writeheader
; writeHeader(rdi = buffer, rsi = 256, rdx = 256)
mov rdi, buffer
mov rsi, 256
mov rdx, 256
call writeHeader
mov r8, rax ; store the buffer size (bufsize) in r8

; status = write(fd, buffer, bufsize)
; sys_write: rax=1, rdi=fd, rsi=buffer, rdx=bufsize)
mov rax, 1 ; 1 is the system call number for sys_write
mov rdi, r9 ; the file handle (fd) is stored in r9
mov rsi, buffer ; the buffer is in the .bss section
mov rdx, r8 ; r8 holds the buffer size (bufsize)
syscall ; execute the sys_write system call
mov r10, rax ; status will be stored in r10

; check for error
; compare 0 and data returned to rax from opening file.
mov r11, 2
cmp r9, 0
jl .error


pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8

mov rax, 0
ret




.error:
; mov error code in r11 into rax to indicate error, and return it
mov rax, r11 ; rll holds error code
ret

如果我的代码应该工作,那么测试文件访问它的方式可能有问题,如果是这种情况请告诉我,这样我就可以集中资源解决问题而不是修复我的代码已经有效了。

最佳答案

cmp r9, 0
jb .error ; <-- This will never happen!

测试负数时不要使用jb。这是为处理无符号数而保留的。使用 jl

cmp r9, 0
jl .error

关于linux - 打开一个 .ppm 文件并向其中写入一些数据。 AMD64 linux 汇编 Nasm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28331648/

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