Gå til innhold

Anbefalte innlegg

Skrevet (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

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
Videoannonse
Annonse
Skrevet

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. :p

Skrevet
Jeg vet Jaffe kommer til å levere i alle fall, dette er barnemat for han. :p

 

Nå skal du ikke ta for sterkt i her... :p Kan verken linux- eller windows-assembly.

 

Må det forresten være for et spesifikt OS?

Skrevet

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! :)

  • 2 uker senere...
Skrevet (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 av ratix
Skrevet
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 :p IA-64 hadde hatt et overtak med tanker på hopp-kommandoer :D

Skrevet (endret)
Hvor sjekker du kommandolinjeargumentene?

 

skift.exe < fra_fil.txt > til_fil.txt
Som vist i eksempelet så er det ingen kommandolinjeargumenter, bare pipes, derfor leser jeg fra standard input og skriver til standard output. Endret av ratix
  • 2 uker senere...
Skrevet (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 av Eudoxos
Skrevet
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 :)
Skrevet

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

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...