frodeaa Skrevet 21. november 2007 Del Skrevet 21. november 2007 (endret) Daarlig lite aktivitet paa det forumet her, men jeg proever likevel med en "ASM Challenge". Jeg har en oppgave som vi fikk paa skolen i fjor, som jeg kunne tenkt meg aa sett flere loesninger paa. Alle bidrag kan PM (kode + kompilert filstoerrelse i bytes) til meg, og ved slutten av fristen saa skal jeg legge ut alle bidrag og erklere en "vinner". Dette er en god maate aa faa litt trening i "ASM kreativ tenking" paa. Oppgave: Skriv et assembly program til DOS (x86) som leser en tekst fil, skifter smaa bokstaver til store, og omvendt, for saa aa skrive det hele til en ny tekst fil. Bare a-z og A-Z skal beroeres. Tall og andre ting maa forbli det samme. Eksempel: skift.exe < fra_fil.txt > til_fil.txt fra_fil.txt ABCDEfghij 123456 !@#$% til_fil.txt abcdeFGHIJ 123456 !@#$% Vinner erkleres ut fra foelgende kriterier: - Minst mulig JMP kommandoer. - Fil stoerrelse (bytes), dersom samme antall JMP kommandoer. Frist er neste Onsdag kl. 19.00 norsk tid. Jeg kommer ikke til aa delta, men legger ved min loesning fra ifjor sammen med andre bidrag. *haaper noen gidder aa delta* Endret 21. november 2007 av frodeaa Lenke til kommentar
DeadManWalking Skrevet 21. november 2007 Del Skrevet 21. november 2007 Jeg har forferdelig dårlig tid, men får jeg tid skal jeg prøve! Assembly er langt i fra noe jeg har erfaring i, leverer jeg blir laget med nasm i såfall. Kjekt å høre at noen bryr seg, godt initiativ fra din side! Jeg vet Jaffe kommer til å levere i alle fall, dette er barnemat for han. Lenke til kommentar
Jaffe Skrevet 21. november 2007 Del Skrevet 21. november 2007 Jeg vet Jaffe kommer til å levere i alle fall, dette er barnemat for han. Nå skal du ikke ta for sterkt i her... Kan verken linux- eller windows-assembly. Må det forresten være for et spesifikt OS? Lenke til kommentar
frodeaa Skrevet 21. november 2007 Forfatter Del Skrevet 21. november 2007 Saa lenge det er x86 saa spiller det igrunn ingen rolle hva OS. Den opprinnelige oppgaven var til DOS, og min "loesning" er derfor til DOS. Men send bidrag til det du syns er greiest. Kjekt aa see at iaffal to har litt interesse av aa bidra. Haaper flere har lyst aa vaere med ogsaa! Lenke til kommentar
ratix Skrevet 5. desember 2007 Del Skrevet 5. desember 2007 (endret) Jeg vet at fristen har gått ut, men jeg kom over dette i dag og bestemte meg for å levere likevel! Kildekode: l2.s Programmet er for Linux og er skrevet i nasm. Hvordan kompilere: nasm -f elf l2.s && (ld -o l2 l2.o; strip -sR .comment l2) Endret 5. desember 2007 av ratix Lenke til kommentar
Jaffe Skrevet 5. desember 2007 Del Skrevet 5. desember 2007 Hvor sjekker du kommandolinjeargumentene? Lenke til kommentar
Zethyr Skrevet 5. desember 2007 Del Skrevet 5. desember 2007 Saa lenge det er x86 saa spiller det igrunn ingen rolle hva OS. - Minst mulig JMP kommandoer. Usj, at det måtte være x86 da IA-64 hadde hatt et overtak med tanker på hopp-kommandoer Lenke til kommentar
ratix Skrevet 5. desember 2007 Del Skrevet 5. desember 2007 (endret) Hvor sjekker du kommandolinjeargumentene? skift.exe < fra_fil.txt > til_fil.txtSom vist i eksempelet så er det ingen kommandolinjeargumenter, bare pipes, derfor leser jeg fra standard input og skriver til standard output. Endret 5. desember 2007 av ratix Lenke til kommentar
Eudoxos Skrevet 16. desember 2007 Del Skrevet 16. desember 2007 (endret) Jeg vet også at det er for sent, men har laget en løsning som bare bruker én jump-instruksjon, nemlig den til main-loopen. I tillegg er det to INT-instruksjoner for systemkall (read og write). Jeg regner med de ikke teller? Koden kan assembles og linkes ved å lagre den i en fil swapcase.s og kjøre "as -o swapcase.o swapcase.s && ld -o swapcase swapcase.o". Programmet er stort og klumpete, men oversiktlig slik som det er nå. Det kan sikkert reduseres til halve størrelsen hvis man prøver. .section .data SYS_EXIT: .long 1 SYS_READ: .long 3 SYS_WRITE: .long 4 STDIN: .long 0 STDOUT: .long 1 temp: .long 0 .section .text .globl _start loop: # Change case by XORing with 00100000 if character is letter movl temp, %eax shrl $6, %eax movl temp, %ebx andl $159, %ebx dec %ebx cmpl $26, %ebx setb %bl movzbl %bl, %ebx andl %ebx, %eax shll $5, %eax xorl %eax, temp # Write the modified byte to standard output movl SYS_WRITE, %eax movl STDOUT, %ebx leal temp, %ecx movl $1, %edx int $0x80 # Program entry point is here! _start: # Read one byte from standard input movl SYS_READ, %eax movl STDIN, %ebx leal temp, %ecx movl $1, %edx int $0x80 # Jump to top of loop if we read one byte successfully cmp $1, %eax je loop # Exit properly movl SYS_EXIT, %eax xorl %ebx, %ebx int $0x80 Zethyr: Jeg skulle gjerne sett et IA-64 program som gjorde dette uten hopp-instruksjoner... :-) Endret 16. desember 2007 av Eudoxos Lenke til kommentar
Zethyr Skrevet 16. desember 2007 Del Skrevet 16. desember 2007 Zethyr: Jeg skulle gjerne sett et IA-64 program som gjorde dette uten hopp-instruksjoner... :-)Man bør vel gjerne ha én ivhertfall der også, men det er lettere å lage oversiktlig og fin kode for IA-64 synes nå jeg Lenke til kommentar
Emancipate Skrevet 20. desember 2007 Del Skrevet 20. desember 2007 Nå er jeg ikke helt stødig i AT&T-syntaks, men dette er det samme som over uten JMP og burde virke. .section .data SYS_EXIT: .long 1 SYS_READ: .long 3 SYS_WRITE: .long 4 STDIN: .long 0 STDOUT: .long 1 temp: .long 0 .section .text .globl _start loop: # Change case by XORing with 00100000 if character is letter movl temp, %eax shrl $6, %eax movl temp, %ebx andl $159, %ebx dec %ebx cmpl $26, %ebx setb %bl movzbl %bl, %ebx andl %ebx, %eax shll $5, %eax xorl %eax, temp # Write the modified byte to standard output movl SYS_WRITE, %eax movl STDOUT, %ebx leal temp, %ecx movl $1, %edx int $0x80 # Program entry point is here! _start: # Read one byte from standard input movl SYS_READ, %eax movl STDIN, %ebx leal temp, %ecx movl $1, %edx int $0x80 # Jump to top of loop if we read one byte successfully cmp $1, %eax mov exit, %eax mov loop, %edx cmove %edx, %eax push eax ret exit: # Exit properly movl SYS_EXIT, %eax xorl %ebx, %ebx int $0x80 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå