Я пишу программу в сборке AMD64 linux Assembly (ассемблер Nasm), который выполняет целую кучу вещей. В основном, мой вопрос прямо сейчас заключается в том, как я могу открыть файл и написать ему некоторые данные.Откройте файл .ppm и напишите некоторые данные. AMD64 linux Assembly 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
Если мой код должен работать, то есть, вероятно, что-то неправильно, в котором способ испытания файла доступ к нему, если тот случай, просто дайте мне знать, так что я могу сосредоточить свои ресурсы на устранении этой проблемы, а не на исправлении кода, который уже работает.
Вы уверены, что это 'подставить пользовательский код', а не псевдокод? – EOF
Я никогда раньше не слышал о коде «замените пользователя». Я просто посмотрел, и термин «Судо» не подходит для этой фразы. Так что да, это еще один способ сказать sudo-код. – tysonsmiths
№ «sudo» - это не то, что вы думаете. Вы просто не знаете, как называть «псевдо». – EOF