15. oktober 2002 - 08:21Der 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!!!
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"
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).
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.
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.
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!
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.
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.
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.
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.
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?
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 ... :-)
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'"
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.