Okee, voor alle duidelijkheid, ik ben redelijk onbekend wat betreft assembly. Ook wegens gebrek aan goede tutorials (Intel IA-32 reference design boeken dan weer wel
) moet ik dit mij voornamelijk aan de hand van codevoorbeelden aanleren. Dat is natuurlijk niet helemaal waar, de intel boeken zijn enorm informatief, maar bij gebrek aan deel 3 kom ik er toch niet helemaal uit.
Situatie:
ik heb de volgende code. Deels van OSDever (Bona Fide OS), deels zelf geprutst:
Dit kan ik compilen met NASM, en testen met bochs. Echter, dit werkt niet. Ik krijg geen output op mijn scherm. Waarom niet? Al sla je me dood!
Mijn vermoeden is dat er bij een 'call' wordt gewisseld van stack, waardoor het poppen niet lukt in de 'functies' zelf. Daarentegen stond in de intel boeken dat zolang er niet tussen security levels wordt geswitched, dat er dan niets met de stack pointer gebeurt bij een call. Waar ga ik dus de mist in?
Edit: Na wat testjes ben ik erachter dat PutStr inderdaad wordt aangeroepen. PutChar echter nooit. Het kan dus niet anders dan dat esi niet bevat wat ik in eerste instantie heb gepushed. Moet ik dan toch eerst de stack selecteren op de een of andere manier? En waar vind ik die stack dan?
Situatie:
ik heb de volgende code. Deels van OSDever (Bona Fide OS), deels zelf geprutst:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| [BITS 16] ; 16 bit code generation
[ORG 0x7C00] ; Origin location
; Main program
main: ; Label for the start of the main program
mov eax,0x0000 ; Setup the Data Segment register
; Location of data is DS:Offset
mov ds,eax ; This can not be loaded directly it has to be in two steps.
; 'mov ds, 0x0000' will NOT work due to limitations on the CPU
mov esi, HelloWorld ; Load the string into position for the procedure.
push esi
call PutStr
sti ; Do not disturb
hlt ; or do anything else
PutStr:
pop esi ; retreive position of string
.nextchar3
lodsb ; load next character of string into al
or al,al
ret
push eax ; cramming it onto the stack
call PutChar ; calling output function
jmp .nextchar3 ; next char!
; Procedures
PutChar: ; Procedure label/start
; Set up the registers for the interrupt call
pop eax
mov ah,0x0E ; The function to display a character (teletype)
mov bh,0x00 ; Page number
mov bl,0x07 ; Normal text attribute
int 0x10 ; Run the BIOS video interrupt
ret ; Return to main program
; Data
HelloWorld db 'Hello World',13,10,0
; End Matter
times 510-($-$$) db 0 ; Fill the rest with zeros
dw 0xAA55 ; Boot loader signature |
Dit kan ik compilen met NASM, en testen met bochs. Echter, dit werkt niet. Ik krijg geen output op mijn scherm. Waarom niet? Al sla je me dood!
Mijn vermoeden is dat er bij een 'call' wordt gewisseld van stack, waardoor het poppen niet lukt in de 'functies' zelf. Daarentegen stond in de intel boeken dat zolang er niet tussen security levels wordt geswitched, dat er dan niets met de stack pointer gebeurt bij een call. Waar ga ik dus de mist in?
Edit: Na wat testjes ben ik erachter dat PutStr inderdaad wordt aangeroepen. PutChar echter nooit. Het kan dus niet anders dan dat esi niet bevat wat ik in eerste instantie heb gepushed. Moet ik dan toch eerst de stack selecteren op de een of andere manier? En waar vind ik die stack dan?
[ Voor 15% gewijzigd door RSpliet op 10-06-2005 11:04 ]
Schaadt het niet, dan baat het niet