PDA

Visualizza la versione completa : [Assembler] output


PeppePes88
15-10-2008, 23:55
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 !



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???

menphisx
16-10-2008, 00:20
Ecco come scrivere su stdout



%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.

:ciauz:

Edgar89
16-10-2008, 10:03
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? :bh:

menphisx
16-10-2008, 22:13
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? :bh:

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:


mov ah, 0x0E
mov bx, 0x07
mov si, testo
int 0x10


Comunque controlla la Interrupt list di Brown.

PeppePes88
17-10-2008, 18:18
Ho controllato nel sito che mi hai indicato, ti ringrazio perch un ottimo sito !
Comunque non sono ancora riuscito a farlo funzionare :




#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 :


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..

oregon
17-10-2008, 18:56
Se il tuo programma gira in user mode, non puo' accedere agli int del BIOS.

PeppePes88
17-10-2008, 19:57
Da errore di compilazione non di esecuzione....

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

oregon
17-10-2008, 20:12
http://groups.google.co.kr/group/comp.os.linux.development.system/browse_thread/thread/9c6b52f8e07656db

PeppePes88
17-10-2008, 21:35
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!!!! :bh: :bh: :bh:

i codici che ho provato sono sempre :




.global _start

_start :
mov 0x0E , %ah
mov 0x65, %al
mov 0x07, %bh
mov 0x00, %bl
int $0x10
ret





.text

.GLOBAL _start

_start:
PUSH %AX

PUSH %DX

MOV $0x02,%AH

MOV %AL,%DL

INT $0x21

POP %DX

POP %AX

RET



con questi comandi :



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 ....
:confused: :confused:

menphisx
17-10-2008, 23:58
No guarda, non puoi richiamare il BIOS cos.
Usa write -.-

Loading