我正在用 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/