Hello world from low level – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Hello world from low level – Assembler – Fórum – Programujte.comHello world from low level – Assembler – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Sefiros0
Návštěvník
4. 11. 2013   #1
-
0
-

Hoj,

mám takový problém, mám bootloader jež má vypisovat řetězec, ale on ho ňák nevypisuje a opravdu netuším čím to je.

{
   x86 real mode [16 bit] 
   GNU binutils [AS , LD]
   emulováno pomocí BOCHS
}

// <------------------------------------->
.intel_syntax noprefix
.code16
// <------------------------------------->

.macro printStr strAdr , lenght
mov cx , \lenght
mov si , \strAdr
printStrLoop:
mov al , byte ptr [si] // tady bude zakopanej pes ...
mov ah , 0xe
int 0x10
inc si
loop printStrLoop
.endm

.globl entryPoint
entryPoint:
printStr welcomeString , 26
endls:
nop 
jmp endls
welcomeString: .string "Hello world from low level!"

// <------------------------------------->      
.org 510
.byte 0x55          
.byte 0xaa
.att_syntax noprefix
// <------------------------------------->

linker skript (jo já vím, je blbě, ale aspoň to už nevyhazuje takovej jeden divnej error ... )

SECTIONS
{
	.text : { *(.text) }
	.data : { *(.data) }
  	.bss : { *(.bss) }
}
Nahlásit jako SPAM
IP: 80.188.252.–
Reklama
Reklama
illioner0
Stálý člen
5. 11. 2013   #2
-
0
-

Zdar, ja jsem pouzival myslim spis sluzbu Int10/0xA nez tve 0xE

Zapisujes to na prvni sektor disku? Pises sice o bootloaderu,
ale abys to nezapisoval primo uz na BOOT sektor

Pak napr. zkus nastavit registr DS, nemas uplne jiste ze ti ukazuje
na stejny segment pameti s kodem a tvym retezcem.
Ctes s nim z toho [SI]

Sluzba 0xA navic ocekava obcas registr BX s videostrankou a barvou
BOSCH na to nepravdepodobne muze byt haklivej

jinak nevim

Nahlásit jako SPAM
IP: 90.178.107.–
Nechápu softwarové firmy, ktere utrácejí za čim dál těžkopádnější DRM ochranu!! Vidět kolem snahu o free2play model je jako příjemné připomenutí časů shareware (jen ten Microsoft stále nic nepochopil)
Sefiros0
Návštěvník
5. 11. 2013   #3
-
0
-

Hoj,

díky za odpověď, máš pravdu, ňák sem se vysral na princip segment:offset. Už sem to napravil ALE ... vyzbrojen informacema sem se hrdině vrhl do implementace ale ... zase hovno. Použil sem ze zoufalství nechutný hackování, v hex editoru sem si našel offset začátku mého řetězce a k této hodnotě sem poté přičet 0x7c00 (adresa na kterou se nahraje bootloader). Výsledné číslo sem poté upravil na segment DS=1 (odečetl jsem od něj 16). Ale zase hovno, vypsalo mi to pár posledních písmen řetězce (to byl úspěch! xD). Tak sem tedy od toho podle citu pár bajtů odečet a dostal se k vypsání mé věty. Bohužel tento přístup opravdu nejde v praxi použít a ani nejsem schopen logicky vysvětlit kde se vzalo mnou vypočítané číslo. Dole přikládám aktuální zdroják a otázka zůstává stejná. Jak ten blbej ASM donutit zobrazit můj řetězec bez tohodle hackování s hex editorem.

// <------------------------------------->
.intel_syntax noprefix
.code16
// <------------------------------------->

.macro initDSSegment num
mov ax , \num
mov ds , ax
.endm

.macro printStr strAdr , lenght
mov cx , \lenght
mov si , 31750 /* zde je ta prokletá adresa ... */
printStrLoop:
mov al , byte ptr [si]
mov ah , 0xe
int 0x10
inc si
loop printStrLoop
.endm

.globl entryPoint
entryPoint:
initDSSegment 1
printStr welcomeString , 27
endls: jmp endls

// <------------------------------------->      
welcomeString: .string "Hello world from low level!" 
// <------------------------------------->      

// <------------------------------------->      
.org 510
.byte 0x55          
.byte 0xaa
.att_syntax noprefix
// <------------------------------------->
SECTIONS
{
	.text : { *(.text) }
	.data : { *(.data) }
  	.bss : { *(.bss) }
}

 <MIMO téma, ale mohl bys vysvětlit co to je ta videostránka, nikde sem pořádně neviděl vysvětlení>

Nahlásit jako SPAM
IP: 80.188.252.–
Sefiros0
Návštěvník
5. 11. 2013   #4
-
0
-

Dostal sem se zase dál, už je to v podle mne validním stavu, ale GAS ASM mi hází klacky pod nohy. Dole přikládám kód a disassemblovanou binárku.

// <------------------------------------->
.intel_syntax noprefix
.code16
// <------------------------------------->

.macro initDSSegment num
mov ax , \num
mov ds , ax
.endm

.macro printStr strAdr , lenght
mov cx , \lenght
mov si , \strAdr
printStrLoop:
mov al , byte ptr [si] 
mov ah , 0xe
int 0x10
inc si
loop printStrLoop
.endm

.globl entryPoint
entryPoint:
initDSSegment 0x7c0
printStr welcomeString , 27
endls: jmp endls

// <------------------------------------->      
welcomeString: .string "Hello world from low level!" 
// <------------------------------------->      

// <------------------------------------->      
.org 510
.byte 0x55          
.byte 0xaa
.att_syntax noprefix
// <------------------------------------->
  

a zde je disassemblovaná binárka

 0:	b8 c0 07             	mov    ax,0x7c0
   3:	8e d8                	mov    ds,ax
   5:	b9 1b 00             	mov    cx,0x1b
   8:	8b 36 17 00          	mov    si,WORD PTR ds:0x17 // Offset 0x17 je validní, jedná se skutečně o začátek řetězce. Vrásky mi však dělá to, co sakra dělá ten blbej assembler s WORD PTR ds:0x17. Mám pocit že dělá nějaký mnou nechtěný nadstandard ...
   c:	8a 04                	mov    al,BYTE PTR [si]
   e:	b4 0e                	mov    ah,0xe
  10:	cd 10                	int    0x10
  12:	46                   	inc    si
  13:	e2 f7                	loop   0xc
  15:	eb fe                	jmp    0x15	// ZDE je Konec ...
  17:	48                   	dec    ax
  18:	65                   	gs		
  19:	6c                   	ins    BYTE PTR es:[di],dx
  1a:	6c                   	ins    BYTE PTR es:[di],dx
  1b:	6f                   	outs   dx,WORD PTR ds:[si]
  1c:	20 77 6f             	and    BYTE PTR [bx+0x6f],dh
  1f:	72 6c                	jb     0x8d
  21:	64 20 66 72          	and    BYTE PTR fs:[bp+0x72],ah
  25:	6f                   	outs   dx,WORD PTR ds:[si]
  26:	6d                   	ins    WORD PTR es:[di],dx
  27:	20 6c 6f             	and    BYTE PTR [si+0x6f],ch
  2a:	77 20                	ja     0x4c
  2c:	6c                   	ins    BYTE PTR es:[di],dx
  2d:	65                   	gs
  2e:	76 65                	jbe    0x95
  30:	6c                   	ins    BYTE PTR es:[di],dx
  31:	21 00                	and    WORD PTR [bx+si],ax
	...
 1fb:	00 00                	add    BYTE PTR [bx+si],al
 1fd:	00 55 aa             	add    BYTE PTR [di-0x56],dl
Nahlásit jako SPAM
IP: 80.188.252.–
z
~ Anonymní uživatel
268 příspěvků
6. 11. 2013   #5
-
0
-

Nespoléhal bych na nic jiného, než na to, že se ti to spustí   

.code16

start:
jmpl $0x07C0, $start2
start2:
movw %cs, %ax
movw %ax, %ds
movw %ax, %es
movw %ax, %ss
movw $0x7c00, %sp

...

.org 510
.byte 0x55          
.byte 0xaa
Nahlásit jako SPAM
IP: 88.101.8.–
Sefiros0
Návštěvník
6. 11. 2013   #6
-
0
-

to Z : ujišťuji tě že tady problém není ... 
Problém je zde : 
mov si,WORD PTR ds:0x17
A já potřebuju aby mi tam GAS dal jen 
mov si, 0x17
Poté všechno bude šlapat jak hodinky, DS segment je už inicializován na 0x7c0 (*16=0x7c00 == začátek paměti s bootloaderem + offset 0x17 a sem nazačátku přaného řetězce...). V dissasemblovaný binárce se jde přesvědčit že skutečně začíná řetězec na 0x17.

Nahlásit jako SPAM
IP: 80.188.252.–
z
~ Anonymní uživatel
268 příspěvků
6. 11. 2013   #7
-
0
-

Jo, já jsem si vůbec nevšiml, že jsi konečně přišel na to, co do toho DS dát. Až objevíš další registry, tak se stav.

A když do toho SI chceš dát offset, tak tam dej offset.

Nahlásit jako SPAM
IP: 88.101.8.–
Sefiros0
Návštěvník
6. 11. 2013   #8
-
0
-

to Z:
Chlape, si idiot, fakt miluju takový chytrolíny kteří dělaj borce a přitom vědí sami hovno. Tvoje první rada byla naprosto zbytečná (neřešila můj problém -> ani se k němu neblížila). Krom registru DS žádný jiný zatím nepotřebuji (stack přijde na řadu později a paměť dereferencuju zkrz DS:SI). K tvému doporučení "A když do toho SI chceš dát offset, tak tam dej offset" musím pouze dodat, děkuju za radu to by mě nenapadlo !ironie!.

Asi sem málo popisoval svůj problém (jinak si neumím vysvětlit tvoji ignoranci). Sice je pravda že na úplným začátku sem vypustil používání segmentů no, ale mít blbý kecy a ani si nepřečíst další příspěvky (a zjistit jak se vyvíjí situace) krom prvního je stupidní.

Tady to máš ještě jednou:
Když do registru SI dám přímo offset číslem napevno (mov si, 0x17), vypíše mi to požadovaný řetězec.
Ve chvíli když tam strčím label řetězce (mov si,WORD PTR ds:0x17), tak to začne taky něco vypisovat, ale z úplně jiné adresy.

A teď k řešení které hledám...ASM mi zřejmě 0x17 vezme jako absolutní adresu, a část (a nebo celou) strčí do DS při přiřazení do SI (a tím pádem to vede asi někam do IVT...). Proto teď hledám metodu, jak ASM říct aby ke každé adrese přičetl 0x7c00 (a rozdělení adresy dopadlo validně), a nebo vypnul to "vylepšení" a nastavil vkládání přímo čísel. Toť vše.

Ale je to asi marný, těžko mi může pomoci někdo, kdo (podle mne, třeba nemám pravdu xD) není schopen můj kód spustit, či si ho aspoň přečíst (jinak si neumím vysvětlit ty tvoje "rady")...

Pokud ti vadí útočná forma mého komentu, tak věz že je to tvoje chyba, prostě si mě nasral tím svým navážením v minulém příspěvku... 

Nahlásit jako SPAM
IP: 80.188.252.–
Řešení
z
~ Anonymní uživatel
268 příspěvků
7. 11. 2013   #9
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

mov si , offset \strAdr

Nahlásit jako SPAM
IP: 88.101.8.–
Sefiros0
Návštěvník
7. 11. 2013   #10
-
0
-

Nezbývá mi nic jiného než poděkovat. Klíčové slovo offset provedlo přesně to co jsem potřeboval. Nyní bootloader vypisuje co má.

Nahlásit jako SPAM
IP: 80.188.252.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 173 hostů

Podobná vlákna

Hello world — založil Vítězslav Titl

World of Warcraft — založil VojtaK

World of warcraft — založil Samuel Lehotský

Hello world v 8080 — založil chaser

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý