Domanda

Sto cercando di scrivere byte 0xff alla porta parallela a 0x378. Compila e collega senza problemi, ma Segfaults al OUTSB istruzione.

section .text
        global _start

_err_exit:
        mov     eax,    1
        mov     ebx,    1
        int     80h

_start:
        mov     eax,    101     ; ioperm
        mov     ebx,    0x378   ; Parallel port addr
        mov     ecx,    2       ; number of bytes to 'unlock'
        mov     edx,    1       ; enable
        int     80h

        mov     esi,    0xff
        mov     dx,     0x378
        outsb

        mov     eax,    1       ; exit
        mov     ebx,    0
        int     80h

Se lo passo con GDB e controllo i registri appena prima del OUTSB Istruzioni, non sembra che ci sia nulla nel registro DX? o dx == edx in 32 bit?

(gdb) info registers 
eax            0x0  0
ecx            0x2  2
edx            0x378    888
ebx            0x378    888
esp            0xffffd810   0xffffd810
ebp            0x0  0x0
esi            0xff 255
edi            0x0  0
eip            0x8048090    0x8048090 <_start+36>
eflags         0x246    [ PF ZF IF ]
cs             0x23 35
ss             0x2b 43
ds             0x2b 43
es             0x2b 43
fs             0x0  0
gs             0x0  0

Cosa sto facendo di sbagliato qui?

(Informazioni sulle istruzioni per outs: http://siyobik.info/main/reference/instruction/outs%2foutsb%2foutsw%2foutsd)


MODIFICARE:

La versione C del programma funziona:

int main(int argc, char *argv[])
{
  int addr = 0x378;
  int result = ioperm(addr,5,1);

  outb(0xff, addr);

}

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top