Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Discussione: [Assembler] output

  1. #1

    [Assembler] output

    Ciao...

    Ho da poco iniziato lo studio dell'assembler e poichè uso linux ho trovato subito problemi nel tradurre una funzione scritta per il dos, a causa degli interup !

    codice:
     
    output: PUSH %AX
    
            PUSH %DX
    
            MOV  $0x02,%AH
    
            MOV  %AL,%DL
    
            INT  $0x21
    
            POP  %DX
    
            POP  %AX
    
            RET
    l'unico modo che ho trovato e quello di chiamare la system call _write!! Pero non mi va bene...
    Mi potete aiutare??
    E poi in linux devo sempre invocare int 0x80 , e passare tramite il kernel ?? Non posso fare come nel dos chiamate dirette al bios e di conseguenza alle periferiche???

  2. #2
    Ecco come scrivere su stdout

    codice:
    %define SYS_WRITE 4
    %define SYS_EXIT 1
    
    %define STDOUT 1
    
    %define SYSTEM_INTERRUPT 0x80
    
    section .text ;;Code Segment
    global _start ;;Start (for linker)
    
    section .data
    msg db 'Hello, World', 0xA, 0xD ;;Message DataByte + \n
    len equ $ - msg ;;Message length
    
    _start:
            ;;int write(int fd, void *buf, size_t count)
            mov     eax, SYS_WRITE
            mov     ebx, STDOUT
            mov     ecx, msg
            mov     edx, len
            int SYSTEM_INTERRUPT
    
            mov eax, SYS_EXIT
            int SYSTEM_INTERRUPT
    Compilalo con NASM, e funziona.


  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    21
    sono con il contatto di un amico...
    si... così funziona ed è il metodo che conosco anche io... tuttavia volevo sapere se esisteva un altro metodo più diretto...

    nessuno mi ha risposto sull'obbligo di evocare int 0x80... qualche suggerimento?
    Everything happens for a reason...

  4. #4
    Originariamente inviato da Edgar89
    sono con il contatto di un amico...
    si... così funziona ed è il metodo che conosco anche io... tuttavia volevo sapere se esisteva un altro metodo più diretto...

    nessuno mi ha risposto sull'obbligo di evocare int 0x80... qualche suggerimento?
    Se lavori direttamente col BIOS, si fa in un'altro modo ... ma non capisco il senso.
    Se lavori sotto OS, usi le syscall, se no puoi combinare pasticci (anche su DOS utilizzi le syscall ...)
    Sinceramente non ho mai provato.
    Comunque per chiamare direttamente il BIOS:
    codice:
    mov ah, 0x0E
    mov bx, 0x07
    mov si, testo
    int 0x10
    Comunque controlla la Interrupt list di Brown.

  5. #5
    Ho controllato nel sito che mi hai indicato, ti ringrazio perchè è un ottimo sito !
    Comunque non sono ancora riuscito a farlo funzionare :

    codice:
    #AH = 0Eh
    #AL = character to write
    #BH = page number
    #BL = foreground color (graphics modes only)
    
    
    
    .global _start 
    	
    	_start : 
    		mov 0x0E , %ah
    		mov 0x65, %al
    		mov 0x07, %bh
    		mov 0x00, %bl
    		int 0x10
    io uso l'assembler gas , come compilatore as , e come distribuzione di linux ubuntu se puo essere utile...
    l'errore che ottengo è questo :
    codice:
    prova_interup.s:15: Error: suffix or operands invalid for `int'
    che mi dice che la chiamata di interrup è errata!
    Mi permette solo quella 0x80..

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se il tuo programma gira in user mode, non puo' accedere agli int del BIOS.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Da errore di compilazione non di esecuzione....

    E non di certo perchè non esegue il compilatore con i diritti di root....

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

  9. #9
    ok!!
    Ora ho capito qual'è il problema , predendo i diritti di amministrazione in teoria dovrei risolvere tutto???

    Ma purtroppo non va cosi , il risultato è segmentetion fault!!!!

    i codici che ho provato sono sempre :
    codice:
     
    
    
    .global _start 
    	
    	_start : 
    		mov 0x0E , %ah
    		mov 0x65, %al
    		mov 0x07, %bh
    		mov 0x00, %bl
    		int $0x10
    		ret
    codice:
     
    .text
    
    .GLOBAL _start
    
    _start: 
    	PUSH %AX
    
            PUSH %DX
    
            MOV  $0x02,%AH
    
            MOV  %AL,%DL
    
            INT  $0x21
    
            POP  %DX
    
            POP  %AX
    
            RET
    con questi comandi :
    codice:
     
    
    as prova.s -o temp.o
    ld -o temp.o  prova
    sudo ./prova
    Ho provato anche a fare tutto da root ma non cambia niente!!!!

    HELP HELP ....

  10. #10
    No guarda, non puoi richiamare il BIOS così.
    Usa write -.-

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 © 2025 vBulletin Solutions, Inc. All rights reserved.