Gå til innhold

Anbefalte innlegg

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

ABCDE

fghij

123456

!@#$%

 

til_fil.txt

abcde

FGHIJ

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 av frodeaa
Lenke til kommentar
Videoannonse
Annonse

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
  • 2 uker senere...
  • 2 uker senere...

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 av Eudoxos
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...