Avatar billede kernelx Juniormester
15. oktober 2002 - 08:21 Der er 22 kommentarer og
1 løsning

C7C++ og inline-assembler

er der en, som er god til GNU inline-assembler til C/C++???

Problemet:
Jeg vil have en source-code til et C/C++ - programm, som skriver nogen ord (f.eks.: hello world) paa skaermen.

1. hele coden skal staa i den samme text-fil (alsaa uden #include (uden print eller cout) - altsaa med inline-assembler)

2. kommandoen til at den skriver "hello world" paa skärmen skal direkte gaa til CPU'en (programmet skal fungere ligemeget om det er til Windows eller Linux (Windows/DOS bruger interrupt 21 og Linux interrupt 80)) - altsaa hele denne syscall-del skal skrives selv.
Programmet skal fungere - uafhaengig af kernelen - naermest en egen kernel, som skriver "hello world".


jeg haaber paa, at der er nogen, som kan svare - og siger mange mange tak i forvejen!!!

med venlig hilsem
KernelX
Avatar billede jpk Nybegynder
15. oktober 2002 - 08:37 #1
Jeg har ikke megen forstand på assembler, men jeg har på et tidspunkt stødt på nogle hello-world-eksempler. Det kan være du kan bruge noget af det...
Kender du i øvrigt siderne http://linuxassembly.org og http://www.matbilg.itu.edu.tr/assembler/linassemb.htm? Der er også tutorials mm.


Linux on x86
.text
.globl _start
_start:
movl    $1,%ebx        / file descriptor for stdout in EBX
movl    $hello,%ecx    / address of buffer in ECX
movl    $13,%edx        / length in EDX
movl    $4,%eax        / syscall number for write is 4
int    $0x80          / syscall
movl    $0,%ebx        / exit code is 0
movl    $1,%eax        / syscall number for exit is 1
int    $0x80          / syscall
.data
hello:
.ascii  "Hello world!\n"
Avatar billede kernelx Juniormester
15. oktober 2002 - 08:47 #2
jeg tror, at dette program ikke fungerer under windows, paa grund af at det bruger en syscall, som tilhoerer til linux.
syscall - interrupten til windows er 21
saa det ovenstaaende programm goerer brug af linux-kernelen og fungerer ikke selvstaendigt (tror jeg).
Avatar billede kamikaze Nybegynder
15. oktober 2002 - 12:20 #3
Er det så ikke bare at udskifte syscall-interrupts til windows?!?
Avatar billede kernelx Juniormester
15. oktober 2002 - 12:41 #4
det er ikke det, som det gaar ud paa ...
Programmet skal fungere uden nogen som helst kernel.
ligemeget, om man tager 80 eller 21 ... saa er programmet afhängig af en kernel.
Programmet, som jeg har brug for, skal fungere 100% selvstaendigt, saa denne ene syscall, som bruges, til at skrive noget paa skaermen, skal ogsaa vaere i coden - og ikke hente den fra en kernel, som er installeret i forvejen.
Avatar billede soreno Praktikant
15. oktober 2002 - 15:01 #5
og det vil du eksekvere i et windows/linux miljø ?
jeg tror at operativsystemet beskytter sig selv mod sådan kode. tænk på al det ravage du kunne lave, hvis det var muligt.

hvad skal det bruges til ?
Avatar billede jpk Nybegynder
15. oktober 2002 - 15:11 #6
soreno >> Jeg tror du har ret, moderne operativsystemer (såsom Windows & Linux) kører assembler i protected mode og giver dig ikke ret til hvad som helst...

Du kunne gøre det i real mode, men så kunne det ikke køre under førnævnte operativsystemer!
Avatar billede kernelx Juniormester
15. oktober 2002 - 15:14 #7
jeg ved ... men et gammelt DOS - Styrtesystem har ikke noget imod det
Avatar billede soreno Praktikant
15. oktober 2002 - 15:26 #8
kernelx>> nej, for dos kører real mode..
den eneste måde er vel at kopiere noget direkte over i grafikkortets ram - men det bliver nok hurtigt noget rod. for du kan ikke få adgang til grafikkortets ram i Windows (nt eller bedre) uden at konstruere en driver.
Avatar billede kernelx Juniormester
15. oktober 2002 - 15:40 #9
eller det bliver et boot program ...
Avatar billede soreno Praktikant
15. oktober 2002 - 15:53 #10
men så vil det jo ikke køre med Windows/Linux..
Avatar billede kernelx Juniormester
16. oktober 2002 - 07:35 #11
det var jo meningen!!!
det skal fungere uden windows linux eller hvad som helst. Det skal vaere et 100% selvstaendigt program.
Avatar billede jpk Nybegynder
16. oktober 2002 - 10:31 #12
Problemet er, at hvis programmet skal køre uden om Windows/Linux, får du ikke lov til at køre det på Windows/Linux!

Du skriver netop "programmet skal fungere ligemeget om det er til Windows eller Linux"...
Avatar billede kernelx Juniormester
17. oktober 2002 - 09:04 #13
det ved jeg godt.
men det skal det heller ikke ...
et programm paa boot-sektoeren paa en diskette, som booter og skriver tekst paa skaermen.

jeg ved at det er afhaengigt af grafikkortet, men ved svaret maa ham som svarer selv vaelge, til hvilket grafikkort programmet er skrevet.

coden skal helst vaere dokumenteret: code ;kommentar
Avatar billede debug1305 Nybegynder
17. oktober 2002 - 23:25 #14
Du skal altså bruge et program, som udskriver f.eks 'Hello world' på skærmen og som skal ligges ind i boot sektoren på en diskette?
Skal det skrives i INLINE assembler? Hvorfor ikke bare alm. assembler? Du kan jo alligevel ikke ligge f.eks en .exe fil ind i boot sektoren.
Avatar billede soreno Praktikant
17. oktober 2002 - 23:45 #15
du får nok lidt svært ved at bruge c/c++ - for der er jo ikke implementeret nogle runtime biblioteker hvis ikke der er noget operativ system. så er du jo tvungen til at benytte bios kald eller direkte skriveri til grafikkortets ram. I begge tilfælde kan du ikke benytte c/c++ - du skal bruge assembler direkte, evt. kan du lave filen med debug.exe.
Avatar billede debug1305 Nybegynder
18. oktober 2002 - 00:05 #17
Ja, faktisk kan det hele laves med debug.exe:
Start debug op og skriv 'a 100' for at begynde at indtaste assembler instruktioner på adressen 100. Herefter taster du følgende linier ind og trykker enter en ekstra gang efter den sidste:
mov ax,1301
mov bx,7
mov cx,b
mov bp,10
int 10
jmp 10e

Så skriver du
e 110 'Hello world'
og sætter en diskette i a drevet og skriver
w 100 0 0 1
for at gemme på disketten.
Avatar billede debug1305 Nybegynder
18. oktober 2002 - 00:14 #18
Hovsa en lille fejl. Der skulle stå
mov bp,7c10
i stedet for
mov bp,10
Avatar billede kernelx Juniormester
18. oktober 2002 - 07:35 #19
derhjemme arbeider jeg paa linux redhat 8.0.
og jeg har aldrig proevet assembler i praxis (og alligevel stiller jeg saadan nogen dumme spoergsmaal) :-)

nu skal jeg bare vide om jeg kan skrive assembler-coden i en text-editor gemme det, og saa med en assembler ... compilere indholdet af textfilen in i boot-sektoren.
og hvilken assembler er den beste?
Avatar billede kernelx Juniormester
18. oktober 2002 - 07:59 #20
a 100            ; hvad betyder det?

mov ax,1301      ; og det? hvad sker der med ax registeret?
mov bx,7          ; og her? samme funktion - bare med bx.
                  ; er det ligemeget i hvilket register det kommer?
                  ; skrives tallet 7 i bx? eller henter bx sig informationer
                  ; fra Adressen 7? eller skrives infhpldet af bx paa
                  ; adressen 7?
mov cx,b          ; og her det samme spoergsmaal som hos ax og bx ... ?
mov bp,7c10      ; er bp et register?
int 10            ; kan man ogsaa bruge et andet register, eller skal man
                  ; bruge 10 - og hvis ... hvorfor?
jmp 10e          ; hvor hopper den nu hen?
e 'Hello world'  ; e? er det en komando? eller adressen, hvor
                  ; texten gemmes i?
w 100 0 0 1      ; hvis jeg gaetter rigtigt, saa staar w for write.
                  ; men hvad betyder de sidste parameter? 100, 0 ,0 og 1?

debug1305 ... for du ogsaa svar herpaa ... saa er det alle 200 points til dig  :-)

i oevrigt ... i har vundet ... ingen C/C++ kun assembler ... :-)
Avatar billede soreno Praktikant
18. oktober 2002 - 08:33 #21
int 10 er et kald til interrupt 10 (hex), du kan kigge her http://www-2.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html for at finde betydningen af funktion 1301 (ax)
Avatar billede debug1305 Nybegynder
18. oktober 2002 - 09:12 #22
Her er nogle af debug's kommandoer. Ved at trykke ?, kan du få dem alle frem.

assemble    A [adresse]
enter        E adresse [dataliste]
write        W [adresse] [drev] [førstesektor] [antal]

INT 10h
VIDEO - WRITE STRING (AT and later,EGA)
AH = 13h
AL = write mode
bit 0:Update cursor after writing
bit 1:String contains alternating characters and attributes
bits 2-7:Reserved (0).
BH = page number.
BL = attribute if string contains only characters.
CX = number of characters in string.
DH,DL = row,column at which to start writing.
ES:BP -> string to write

Her er et "screendump", hvor jeg har skrevet koden ind:
(jeg hr forresten også lavet en fejl (til): "e 'Hello world'" skulle have været "e 110 'Hello world'"

C:\WINDOWS\Skrivebord>debug
-a 100
1672:0100 mov ax,1301
1672:0103 mov bx,7
1672:0106 mov cx,b
1672:0109 mov bp,7c10
1672:010C int 10
1672:010E jmp 10e
1672:0110
-e 110 'Hello world'
-w 100 0 0 1
Avatar billede kernelx Juniormester
18. oktober 2002 - 09:52 #23
mange tak ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester