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

标签 linux assembly nasm x86-64 amd-processor

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

相关文章:

c - 将变量传递给 nasm 过程

php - UTF-8贯穿始终

regex - Bash 正则表达式不接受斜杠

c++ - 如何防止并行代码耗尽所有可用的系统内存?

linux - Scanf 汇编中的 char 指针

c - 将 arm 的汇编代码插入到 C 函数中,如何插入外部变量?

java TrayIcon使用具有透明背景的图像

assembly - 是否可以通过在汇编语言中手写代码来提高基于虚拟机的语言的性能?

C 调用 ASM (YASM x86)

linux - 如何创建一个基本的 NASM Assembly (Linux) 计算器来添加两个整数?