2015-02-04 4 views
1

Я пишу программу в сборке 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 

Если мой код должен работать, то есть, вероятно, что-то неправильно, в котором способ испытания файла доступ к нему, если тот случай, просто дайте мне знать, так что я могу сосредоточить свои ресурсы на устранении этой проблемы, а не на исправлении кода, который уже работает.

+0

Вы уверены, что это 'подставить пользовательский код', а не псевдокод? – EOF

+0

Я никогда раньше не слышал о коде «замените пользователя». Я просто посмотрел, и термин «Судо» не подходит для этой фразы. Так что да, это еще один способ сказать sudo-код. – tysonsmiths

+0

№ «sudo» - это не то, что вы думаете. Вы просто не знаете, как называть «псевдо». – EOF

ответ

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

При тестировании на отрицательное число не следует использовать jb. Это зарезервировано для работы с неподписанными числами. Используйте jl.

cmp r9, 0 
jl .error 
+0

Я исправил эту проблему, но она все равно не создаст файл. Чем больше я смотрю на свой код, тем больше я уверен, что это правильно, его просто я бегаю и привязываю все неправильно. Тем не менее, я действительно новичок в сборке, и мой код может открыть файл неправильно. Есть ли другие проблемы, которые вы видите? – tysonsmiths

+1

Если вы переходите к '.error', вы пытаетесь« ret », не выбирая все то, что вы нажали. –

+0

Is 577, «Флаг, который вам только что дано» должен быть выражен в десятичной форме? Он выглядит «правдоподобным флагом в шестнадцатеричном виде -' 0x577' или '577h'. Это просто догадка. –

0
;open file give it a name in section .data file: db "......", 0 
    mov rsi, 577 
    mov rdx, 0o644 
    mov rdi, file 
    mov rax, sys_open 
    syscall 
    mov r13, rax   ;save file descriptor 
    cmp rax, 0    ;return error if negative 
    jl .error 
+0

Можете ли вы объяснить, что это было, что он сделал не так и что вы исправили? – EvergreenTree

0

Copy/ошибка, связанная паста в коде!

 ; 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 

Вы разместили статус в R10, но сравниваете значение в R9.

 Смежные вопросы

  • Нет связанных вопросов^_^