Drobny problem z asm dla 32 bitow

0

Czyli ds i esi sa 32 bitowe ( ? )

Wyczytalem ze i tak z esi uzywa sie tylko dolnych 16 bitow, wiec wykombinowalem ze porostu adres w ds jest tak samo jak pod 16 bitami ale nie :(

Tzn wyswietli mi sie tak:

at

czyli dobrze ale napis nie :( tzn cos zle wpisuje do esi tylko jak to powinno tam byc? bo pod 16 bitami dziala jak ta lala ;) jakos dopiero teraz robie na 32 bitach i tu taki zonk xD a w necie tylko o 16 bitach a gdzie jest mowa o 32 z tym esi to nie czaje lub nie na temat :(

[bits 32]

				jmp start




				
start:				mov ebx, 0x000007C0
					mov ds, ebx
				mov ah, 0x0E
				mov al, 'a'
				int 0x10
					mov al, [booting+3]
					int 0x10
					mov esi, booting
				call message

for				jmp for		
				
message:		cld
				mov ah, 0x0E
				
messagechar:	lodsb
				int 0x10
				cmp al, 0x00
				jz messageend
				jmp messagechar
				
messageend:		ret				
							
booting			db "Booting... Please wait...", 0x00
0

Przestawiłeś procesor w tryb chroniony i uporałeś sie z przerwaniami? To z ds liczy się tylko niższy word, nie zaś z esi. Nie wiem czy wiesz, ale inaczej koduje się niektóre instrukcje /np. call, mov ze względu na imm/ zależnie od trybu. To, że zasmeblujesz dany kod na 32b to jeszcze nic nie znaczy... mały przykład:

mov ebx, 0x000007C0

po zasemblowaniu do pracy w trybie 16bit to:
0x66 0xBB 0xC0 0x07 0x00 0x00
ale w trybie 32b będzie oznaczać:

mov bx, 0x07C0
add [eax], al

po zasemblowaniu dla 32b /jak u Ciebie/ to:
0xBB 0xC0 0x07 0x00 0x00
czyli brak przefiksu size-override, w trybie 16b zostanie to zinterpretowane jako:

mov bx, 0x07C0
add [bx+si], al

Ale to jeszcze procesor strawi - cuda zaczną się dopiero przy instrukcji call... procesor wykona calla, ale do etykiety 'for' nie 'message'. Dlaczego? Przesunięcie kodowane w instrukcji call to adres_docelowy-adres_następnej_instrukcji. Tutaj disp w trybie 16 bit będzie zajmował 16b a nie 32 więc procesor /pomijając inne zawirowania/ skoczy o 2 bajty wcześniej niż chciałeś /instrukcja przy interpretacji ze względu na przesunięcie będzie mieć o 2 bajty długości mniej/...

adres_docelowy_calla:
jmp $ ; 0xeb 0xfe - wszystkie opkody pisane z pamięci ;P
message:

Używaj odpowiedniego do trybu pracy kodowania.
Podaj więcej szczegółów - na takim czymś jedyne co mi przychodzi na myśl to to co wyżej napisałem... ale na bank mam rację.

0

mov ebx, 0x000007C0
mov ds, ebx

bedzie smigac? czy blad? bo mi akurat dziala to

czyli jak mam wykonac instrukcje call ?

Jakie sa jeszcze kwiatki i roznice?

I czym sie rozni laczenie C z asm pod 32 bitami? tzn chodzi mi o wywolywanie funkci C spod asm i etykiety asm spod C

Z GORY DZIEKI!

0

Czy ja po mandaryńsku piszę?
Powyższy kod jest tłumaczony do pracy w 32b, bootloader startuje w trybie 16b. To do jakiego formatu zasemblujesz src nie znaczy, że kod będzie wykonany w danym trybie. Na 4p jest trochę o tworzeniu systemów operacyjnych - poczytaj o przechodzeniu w tryb chroniony.. a najlepiej o wszystkim o czym się da. Jak przełączysz się pod 32b to powyższy kod będzie chodzić.

mov ebx, 0x000007C0
mov ds, ebx

będzie działać, zależnie od asemblera - jedne przyjmują, inne nie... dla procesora to bez różnicy czy ma sizeoverride czy nie ;)

Co do łączenia asm z c - albo wstawki albo asemblacja do .obj i dołaczenie do linkowania. W kodzie asm trzeba upublicznić elementy które mają być dostępne dla innych modułów /zwykle słowo kluczowe 'public' - po dalsze informacje odsyłam do dokumentacji preferowanego asmemblera/. Oczywiście w kodzie w C trzeba dorzucić deklarację danej funkcji czy zmiennej z kodu asm - słyszałeś może o extern? Z tego co pamiętam to w znajdującym się na 4p kursie pisania OS'ów są zawarte wszystkie informacje jakich potrzebujesz... także o łączeniu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1