assembleur x86 sous openbsd

assembleur x86 sous openbsd - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 11-06-2013 à 13:24:46    

:hello:  
 
pour le fun je me remets un peu à l'assembleur sous x86,  
j'ai déjà pratiqué ça il y a quelques années, sur m6509, m68k30, sparc et power...
Je me cantonne pour simplifier le tout aux appels standards "system" (via le kernel donc, pour pas m emmerder avec les interruptions hardwares)
curieusement j'ai un problème avec un code pourtant simplifié (écrire un texte dans un fichier)
je n'arrives pas à générer le fichier...
 
 

section .data
        line    db      "This is Francois on First Line.", 0xa, 0
        len     equ     $ - line
        line2   db      "This is Francois on second Line.", 0xa, 0
        len2    equ     $ - line2
 
section .bss
        bssbuf: resb    len      
        file:   resb    8        
 
section .text
        global _start
 
_start:
        nop             ; for gdb debugger
        pop ebx         ; argc
        cmp ebx,2        
        jne error       ; less or more args
 
        pop ebx         ; name of the program (argv[0])
        pop ebx         ; next arg is name of file  
        cmp ebx,0       ; check if ebx is not zero (ok)
        jbe error       ; to exit
 
        mov [file], ebx ; store filename in local variable
 
        ; file creation  
        mov eax,8
        mov ecx,511     ; access rigths
        int 80h
 
        cmp eax,0       ; created  ok =0
        jbe error
 
        ; open file in read-write
        mov eax,5
        mov ebx, [file] ;name of file for sys_open
        mov ecx,1       ; 0_RDWR
        int 80h
 
        cmp eax,0       ; check if opened ?
        jbe error
 
        mov ebx,eax     ; store file descriptor of the new file
      ; write line1 to the file pointer (ebx)
        mov eax,4       ; sys_write
        mov ebx,[file]
        mov edx,len
        mov ecx,line
        int 80h
 
        ; writhe second line to the file
        mov eax,4
        mov edx,len2
        mov ecx,line2
        int 80h
 
        ; sync all writ buffers with files
        mov eax,36      ; sys_sync
        int 80h
 
        ; close file (file descriptor in ebx is no longer valid
        mov eax,6
        int 80h
 
        mov eax,1
        mov ebx,0
        int 80h         ; exit 0
 
error:
        mov ebx,eax     ; get exit_code
        mov eax,1       ; exit(exit_code)
        int 80h


 
la compilation le linkage et le strip se passe bien  
et le gdb ne m'a pas permis de trouver ce qui déconne.
 

nasm -f elf32 remind_2.asm -o remind_2.o && ld -s remind_2.o -o remind_2.bin ; echo $?


 
Mon OpenBSD est configuré bien sur pour supporter le elf32 comme format exécutable.
Mais de toute façon même en format natif le fichier ne se crée pas, alors que les droits le permettent. (d'ailleurs je sort en exit 0 ce qui prouve que le code va au bout).
 
Je n'arrives pas à trouver, le défaut, je fais pourtant bien d'après les docs, la création du fichier, son ouverture en RW, son ecriture buffer, le sync, et la fermeture...
 
Avez vous des idées de qui merdoie dans mon bout de code.... parce que je sèche là....  :pt1cable:  :na: soit j'ai oublier une tache intermediaire, soit j'en utilise une de travers...
 
Merci :??:  
 
 :hello:  


---------------
Collectionner les vieux serveurs c'est chouette mais c'est lourd et ça prend de la place ;)
Reply

Marsh Posté le 11-06-2013 à 13:24:46   

Reply

Marsh Posté le 12-06-2013 à 22:16:13    

Test: tu vires tout ce qu'il y a après la création du fichier et tu vérifies de visu qu'il est bien créée.


---------------
Recherche affiche de GITS Arise 3 et 4, faire offre.
Reply

Marsh Posté le 13-06-2013 à 08:52:33    

C'est totalement inutile puisqu'il y a le controle d'erreur qui me dit qu'il est pas crée et effectivement c'est le cas.
 ;)
en plus tu penses bien que c'est par là que j'ai commencé mes tests :D  


---------------
Collectionner les vieux serveurs c'est chouette mais c'est lourd et ça prend de la place ;)
Reply

Marsh Posté le 13-06-2013 à 09:31:43    

; file creation  
        mov eax,8
        mov ecx,511     ; access rigths
        int 80h  
Tu devrais pas faire un appel système pour créer le fichier? Là je vois pas quelle ligne est censé créer le fichier.
 
Ca donnerait un truc comme ça:
mov eax, sys_creat      ; create-file sys call
 mov ecx, 511      ; permission  
 int 80h    


---------------
Recherche affiche de GITS Arise 3 et 4, faire offre.
Reply

Marsh Posté le 17-06-2013 à 09:38:24    

salut,
bha justement si c'est eax 8 avec int 80 qui crée le fichier; equ sys_creat
 :hello:

 
Code :
  1. ; file creation 
  2.         mov eax,8
  3.         mov ecx,511     ; access rigths
  4.         int 80h
  5.         cmp eax,0       ; created  ok =0
  6.         jbe error
 

ou

 
Code :
  1. ; file creation 
  2.         mov eax,sys_creat
  3.         mov ecx,511     ; access rigths
  4.         int 80h
  5.         cmp eax,0       ; created  ok =0
  6.         jbe error


c'est la même chose.


Message édité par goblin_rieur le 17-06-2013 à 09:39:56

---------------
Collectionner les vieux serveurs c'est chouette mais c'est lourd et ça prend de la place ;)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed