Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Assembly syscall read

  1. #1

    Assembly syscall read

    Salve,
    Premettendo che sono alle prime armi con assembly, quando leggo un carattere da un file esterno come posso confrontarlo con un valore..Cioe ad esempio se io su un file esterno leggo 0 , quando termina la read io vorrei confrontare questo valore con un altro impostato da me, ma quando termino la syscall read ho solo il numero di byte letti. Sintassi AT&T intel 0x80, architettura 8086.

    Ho provato a fare un compare con il buffer ma da errore:
    cmp $0, $buff
    Ultima modifica di andrea9622; 02-07-2016 a 10:43

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Posta il codice
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    codice:
    .section .data
    
        nomefile:     
           .string  "testinput.txt"
        buff:
            .long 1
    
        fd:
          .long      0  
        fd_len:
          .long    .-fd
        
         hello:
         .ascii "Prova"
    
         hello_len:
        .long    .-hello
        
    
    .section .text
        .global _start
    
    _start:
    
    #Apertura file per lettura
    movl $5, %eax
    movl $nomefile, %ebx
    movl $0, %ecx
    int $0x80
    movl %eax, fd
    
    
    #Controllo corretta apertura
    cmp $0, %eax
    jl end
    
    
    #Lettura carattere per carattere e scrittura
    
    #loop:
    movl $3, %eax
    movl fd, %ebx
    movl $buff, %ecx
    movl $1, %edx
    int $0x80
    movl %eax, %esi
    
    
    cmp $0, $buff    #Il valore che leggo dalla read lo verrei confronatare con  zero
    je end
    
    prova:
      movl $4, %eax
      movl $1 , %ebx
      leal hello, %ecx
      movl hello_len, %edx
      int $0x80
    
    #Chiusura file
    end:
    movl $1,  %eax
    movl $0,  %ebx
    int $0x80
    Ultima modifica di MItaly; 02-07-2016 a 14:40 Motivo: Tag CODE

  4. #4
    Non sono praticissimo con la sintassi AT&T, comunque
    codice:
    cmp $0, $buff
    dovrebbe confrontare 0 con l'indirizzo di $buff; quello che tu vuoi invece è confrontare 0 con la memoria puntata da $buff, quindi qualcosa del genere:
    codice:
    cmpb $0,($buff)
    o, se intendi confrontare il carattere '0' (la cifra, non il terminatore NUL):
    codice:
    cmpb '0,($buff)
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Non sono praticissimo con la sintassi AT&T, comunque
    codice:
    cmp $0, $buff
    dovrebbe confrontare 0 con l'indirizzo di $buff; quello che tu vuoi invece è confrontare 0 con la memoria puntata da $buff, quindi qualcosa del genere:
    codice:
    cmpb $0,($buff)
    o, se intendi confrontare il carattere '0' (la cifra, non il terminatore NUL):
    codice:
    cmpb '0,($buff)
    Si grazie alla fine ho risolto come hai detto te facendo un
    cmpl $'0', $buff
    Ultima modifica di andrea9622; 06-07-2016 a 11:53

  6. #6
    Uhm, no, cmpl $'0', $buff confronta l'indirizzo del buffer buff con il carattere dello zero "allargato" a 32 bit, il che non ha nessun senso.
    Quello che vuoi tu è
    codice:
    cmpb $'0', ($buff)
    Ovvero, confrontare il byte (cmpb) della cifra 0 ($'0') con il byte contenuto (le parentesi) nel buffer buff ($buff).

    (sorry, prima mi ero perso il $ di fronte al '0', come detto conosco della sintassi AT&T giusto quanto mi basta per odiarla; in sintassi Intel sarebbe più chiaramente
    codice:
    cmp BYTE PTR[buff], '0'
    o addirittura, con NASM,
    codice:
    cmp [buff], '0'
    grazie al fatto che consente di omettere l'informazione di larghezza del tipo se non è ambiguo)
    Amaro C++, il gusto pieno dell'undefined behavior.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.