Autor Thema: Assembler Generell (push byte x)  (Gelesen 6164 mal)

JustJim

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« am: 28. November 2013, 15:07 »
hey hey!
Ich hab da n großes Problem. Naja wahrscheinlich eher ein kleines.
Am besten schreibe ich direkt den Code und was dabei rauskommt
_isr0: //Divide by Zero
      cli
      push byte 0
      push byte 0
      jmp isr_common_stub
     _isr1: //Debug
      cli
      push byte 0
      push byte 1
      jmp isr_common_stub

Das erzeugt bei mir den Fehler:
$ make
gcc -m32 -c -o start.o start.S
start.S: Assembler messages:
start.S:67: Error: junk `0' after expression
start.S:68: Error: junk `0' after expression
start.S:72: Error: junk `0' after expression
start.S:73: Error: junk `1' after expression
Es ist gut möglich, dass es mit Nasm gehen würde, aber dann müsste ich den ganzen Code ändern.
Wie mache ich es in der Notation?
for(i=0; i<=length_of_ife; i++)
{
  learn(All);
}

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 28. November 2013, 15:30 »
Der GNU-Assembler benutzt standardmäßig AT&T-Syntax. Wie die funktioniert, ist im Wiki hier beschrieben. Das läuft also für diesen Code im Wesentlichen auf "pushb $0" statt "push byte 0" hinaus, aber du wirst sicher auch noch irgendwann andere Instruktionen benutzen.

Das cli am Anfang ist unnötig, wenn du in der IDT Interrupt Gates (also nicht Trap Gates) benutzt. Das ist die bessere Alternative.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

JustJim

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 28. November 2013, 15:45 »
okay gut. jetzt habe ich aber noch mehr Probleme bekommen :/

Der Teilcode in isrs.c
#include "system.h"
extern void isr0();
extern void isr1();
extern void isr2();
extern void isr3();
extern void isr4();

void isrs_install()
{
set_idt_entry(0, (unsigned)isr0, 0x08, 0x8E);
set_idt_entry(1, (unsigned)isr1, 0x08, 0x8E);
set_idt_entry(2, (unsigned)isr2, 0x08, 0x8E);
set_idt_entry(3, (unsigned)isr3, 0x08, 0x8E);
set_idt_entry(4, (unsigned)isr4, 0x08, 0x8E);
}

Der Teilcode in start.S
.global _start
_start:
    // Stack initialisieren
    mov $kernel_stack, %esp
 
    // C-Code aufrufen
    call main
 
    endlessjmp:
    jmp endlessjmp
   
    //ISRs
    .global _isr0
    .global _isr1
    .global _isr2
    .global _isr3
    .global _isr4
   
    _isr0: //Divide by Zero
      cli
      push $0x0000
      push $0x0000
      jmp isr_common_stub
     _isr1: //Debug
      cli
      push $0x0000
      push $0x0001
      jmp isr_common_stub

.extern _fault_handler
     
     isr_common_stub:
      pusha
      push %ds
      push %es
      push %fs
      push %gs
      mov $0x10, %ax
      mov %ax, %ds
      mov %ax, %es
      mov %ax, %fs
      mov %ax, %gs
      mov %esp, %eax
      push %eax
      mov _fault_handler, %eax
      call %eax
      pop %eax
      pop %gs
      pop %fs
      pop %es
      pop %ds
      popa
      add $8, %esp
      iret

Was mir die Konsole ausspuckt:

start.o: In function `isr_common_stub':
(.text+0x11e): undefined reference to `_fault_handler'
isrs.o: In function `isrs_install':
/home/dennis/Desktop/Tutorial/src/isrs.c:37: undefined reference to `isr0'
/home/dennis/Desktop/Tutorial/src/isrs.c:38: undefined reference to `isr1'
/home/dennis/Desktop/Tutorial/src/isrs.c:39: undefined reference to `isr2'
/home/dennis/Desktop/Tutorial/src/isrs.c:40: undefined reference to `isr3'
/home/dennis/Desktop/Tutorial/src/isrs.c:41: undefined reference to `isr4'
make: *** [kernel] Error 1

Langsam verzweifele ich.
« Letzte Änderung: 28. November 2013, 15:51 von JustJim »
for(i=0; i<=length_of_ife; i++)
{
  learn(All);
}

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 28. November 2013, 16:22 »
Wieso definierst du _isr0 und benutzt es aber als isr0? Benutzt du wirklich einen Compiler, der Unterstriche anhängt? Meines Wissens machen das nur manche Windows-Compiler per Default.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

JustJim

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 28. November 2013, 16:34 »
oh damn. man man! Oh man. Es kam mir zwar seltsam vor, hab mir aber bei nichts gedacht, dass bei bei dem Tut die Vars unterschiedlich dargestellt worden sind. Dummes Windows haha.
Danke. Jetzt Kompiliert er ^^
for(i=0; i<=length_of_ife; i++)
{
  learn(All);
}

JustJim

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 28. November 2013, 16:48 »
soooo. gefixt, kompiliert und in main initialisiert. dannach als test a=a/0; gemacht.
image geupdated und bochs ausgeführt. Er startet immer wieder neu ??.
Ich dachte ich mach das, damit das nicht passiert :S.

Das ist der Code den ich vin Bochs kriege:
00053351628e[CPU0 ] read_RMW_virtual_dword_32(): segment limit violation
und das für ziemlich viele Adressen. Läuft diese Violations also in ner Endlosschleife ab

edit:
hab ein klein wenig geändert.
Jetz bekomm ich von Bochs folgendes:

00124087052e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087058e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087148e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087154e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087244e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087250e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087318e[CPU0 ] fetch_raw_descriptor: GDT: index (736f) e6d > limit (27)
00124087352e[CPU0 ] load_seg_reg(ES, 0x636f): RPL & CPL must be <= DPL
00124087386e[CPU0 ] fetch_raw_descriptor: GDT: index (3f) 7 > limit (27)
00124087420e[CPU0 ] load_seg_reg(ES, 0x000a): RPL & CPL must be <= DPL
00124087476e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087482e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087550e[CPU0 ] load_seg_reg(ES, 0x535f): invalid segment
00124087584e[CPU0 ] load_seg_reg(ES, 0x4d5f): invalid segment
00124087640e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087646e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087714e[CPU0 ] fetch_raw_descriptor: GDT: index (c07) 180 > limit (27)
00124087748e[CPU0 ] fetch_raw_descriptor: GDT: index (a07) 140 > limit (27)
00124087782e[CPU0 ] fetch_raw_descriptor: GDT: index (807) 100 > limit (27)
00124087816e[CPU0 ] fetch_raw_descriptor: GDT: index (607) c0 > limit (27)
00124087850e[CPU0 ] fetch_raw_descriptor: GDT: index (407) 80 > limit (27)
00124087884e[CPU0 ] fetch_raw_descriptor: GDT: index (207) 40 > limit (27)
00124087940e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124087946e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124088014e[CPU0 ] fetch_raw_descriptor: GDT: index (107) 20 > limit (27)
00124088070e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124088076e[DEV  ] read from port 0x0083 with len 4 returns 0xffffffff
00124088222p[IOAP ] >>PANIC<< I/O apic write with len=1 (should be 4)

Bochs startet also ca. 4 mal, dann bleibts hängen und fragt ob ich "die" möchte
« Letzte Änderung: 28. November 2013, 17:57 von JustJim »
for(i=0; i<=length_of_ife; i++)
{
  learn(All);
}

JustJim

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 28. November 2013, 18:10 »
Okay xD auch wenn ich jetzt oft hintereinander gepostet und Beiträge editiert habe...
Ich wollte nur bescheid sagen: Problem gelöst
Der Fehler lag hier:
mov fault_handler, %eax
Es muss heissen:
mov $fault_handler, %eax
for(i=0; i<=length_of_ife; i++)
{
  learn(All);
}

 

Einloggen