Avatar billede stig3 Mester
17. februar 2001 - 17:36 Der er 4 kommentarer og
1 løsning

Assembler

Jeg har fået til opgave i et kursus om operativsyster, at lave et program i C med en funktion, der skal laves i assembler.

Problemet er at jeg er fuldstændig blank når det kommer til assembler, så jeg søger derfor manualer, tutorials eller lignende, der kan hjælpe mig i gang.
Avatar billede puff Nybegynder
17. februar 2001 - 18:04 #1
hvilken processor skal du skrive assembler til?
Avatar billede stig3 Mester
17. februar 2001 - 18:30 #2
Jeg har en AMD k6-233

Vi har dog fået en reference til 386-arkitekturen, men det er også en ret simpel funktion vi skal lave.

add\'e tre tal og returnere overflowet. Men jeg kunne godt bruge lidt generel viden om assembler programmering. Der må da være nogle generelle retningslinier på tværs af processorer - eller hvad ?
Avatar billede stig3 Mester
17. februar 2001 - 18:49 #3
Måske lidt kode i stedet så:


    .file    \"addlong.c\"
    .version    \"01.01\"
gcc2_compiled.:
.text
    .align 4
.globl addlong
    .type    addlong,@function
addlong:
    pushl %ebp            #gemmer ebp på stakken
    movl %esp,%ebp        #flytter sp til ebp
    pushl %ebx            #lægger ebx på stakken
    movl 16(%ebp),%eax   
    movl 8(%ebp),%edx
    movl 12(%ebp),%ecx
    addl %ecx,%edx
    movl 20(%ebp),%ebx
    addl %edx,%ebx
    movl %ebx,(%eax)
    movl CF, %eax        #Denne linie har jeg selv tilføjet
#Ideen med den sidste linie skulle være at returnere flaget CF, som
#indeholder overflowet (så vidt jeg ved), men det compiler ikke :-(

.L1:
    movl -4(%ebp),%ebx
   
    leave
    ret
.Lfe1:
    .size    addlong,.Lfe1-addlong
    .ident    \"GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)\"


Jeg har lavet dette ved at skrive det i C og oversætte med gcc -S
Jeg har så tilføjet en linie, men det fung\'er ik\'

C-\"programmet\"
int addlong( long a, long b, long *c, int c_in ){
  *c = a + b + c_in;
}
Avatar billede stig3 Mester
20. februar 2001 - 10:32 #4
Selvom det ikke virker som om her er den store assembler interesse vil jeg da lige poste hvad jeg kom frem til.

    .file    \"addlong.c\"
    .version    \"01.01\"
gcc2_compiled.:
.text
    .align 4
.globl addlong
    .type    addlong,@function
addlong:
    pushl    %ebp
    movl    %esp, %ebp

    movl    20(%ebp), %eax    #lægger c_in over i eax
    test    $1, %eax    #Tester CF på første bit
    jz    .NoCarryIn    #Hopper hvis CF=0 => ZF=1
    stc            #Sætter CF=1

.NoCarryIn:   
    movl    8(%ebp), %eax    #lægger a ind i edx
    adcl    12(%ebp), %eax    #lægger a+b+c_in(CF) ind i edx
    movl    16(%ebp), %edx    #lægger *c over i edx
    movl    %eax, (%edx)    #lægger resultatet over i det c peger på

.Retur:   
    movl    $1, %eax    #lægger 0 i eax(returværdien)
    jc    .NoCarryOut    #jumper hvis CF er sat (dermed ingen carry)
    movl    $0, %eax    #Hvis CF=1 sættes eax=1

.NoCarryOut:       
    popl    %ebp
    ret
   
.Lfe1:
    .size    addlong,.Lfe1-addlong
    .ident    \"GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.0)\"

Den skulle gerne tage og lægge parameter 1, 2 og 4 sammen, lægge det på den adresse som parameter 3 peger på og returnere Carry flaget.

En tanke............
Mangler der ikke en kategori for assembler ?
Avatar billede codemon Nybegynder
12. marts 2001 - 13:06 #5
Ja lad os få en katagori for assembler
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