Argh, jeg burde opdatere (og rette) denne.
Jeg overvejer at lave noget ren 32bit og noget ren 64 bit.
EDIT: Den er nu opdateret.
Jeg tilføjer så lige nye versioner af cho filtret:
64 bit:
Kode:
;title "cho"
;********************************************************
;* Filnavn: cho.asm *
;* Author: iTick *
;* Version: 1.0 *
;* Kernel: 2.6-32-5-amd64 *
;* Dist: Debian (Squeeze) *
;* Initial Date: 2. Oktober 2013 *
;* Purpose: Filtrere alt andet en alfanummerisk fra *
;********************************************************
; Dette program compiles og linkes som nedenstående: *
; nasm -f elf64 ./cho.asm -o ./cho.o -g -Z ./errors.log *
; ld -o ./cho ./cho.o *
; ld -o ./cho ./cho.o -melf_i386 for 32 bit version
; Notes: *
; mov rcx, buffer tager adressen, hvor *
; cmp byte [buffer], 30h tager indholdet *
;********************************************************
; Syscalls i /usr/include/x86_64-linux-gnu/asm/unistd_64.h
; Arguments i følgende rækkefølge: rax indeholder systemkaldet
; rdi, rsi, rdx, r10, r8, r9
BITS 64 ; Brug 64 bits. Dette er et 64 bit eksempel. IA32 er Intel Architecture 32 bit og kan også bruges.
GLOBAL _start ; Entry point til ELF linkeren (Det er her, eksekveringen starter)
SECTION .data ; Start af data area
SECTION .bss ; Her lægger vi vores uninitialized data.
buffer resb 1
SECTION .text ; Start af code block. Selve assembler koden skal placeres her under
_start:
nop
read:
mov rax, 0 ; Forbered sys_read() kald. x64
mov rdi, 0 ; POSIX filedescriptor stdin
mov rsi, buffer ; Kopier adressen på buffer til ecx
mov rdx, 1 ; Læs en enkelt byte fra den valgte filedescriptor stdin
syscall ; Overgiv kontrollen til kernen og lad den udføre sys_read()
cmp rax, 0 ; Læs returkoden fra sys_read() kaldet. Sammenlign returkoden med 0
je exit ; Hvis de er ens, hoppes der til exit. 0 betyder EOF
; Kontroller om det er mellemrum. 20h
cmp byte [buffer], 20h ; Kontroller om bufferen indeholder hex værdien for ascii tegnet mellemrum
je write ; Hvis det er ascii 20h, er det mellemrum. Så hop til write. je er Jump Equal
; Komtroller ascii værdierne 0-9
cmp byte [buffer],30h ; Sammenlign den læste værdi med 30h (ascii tallet 0, som i 2, 1, 0)
jb read ; Hvis den er mindre end 0 er det et speciel tegn. Så springer vi til read og læser et nyt tegn
cmp byte [buffer],3Ah ; Hvis vi er kommet her til og vi er laver end hex 3A, er det et tal. Det skriver vi ud
jb write ; Brug jb Jump Below til at hoppe til write.
; kontroller ascii værdierne A-Z
cmp byte [buffer], 41h ; Sammenlign den læste værdi med 41h (A), hvis den er mindre, er det ikke et bogstav
jb read ; Hvis ascii tegnet var mindre, så hop til read
cmp byte [buffer], 5Bh ; Hvis den er mindre end 5B har vi ramt i ascii range med store bogstaver. Det vil vi udskrive
jb write
; Kontroller ascii værdierne a-z
cmp byte [buffer], 61h ; Hvis værdien er mindre end 61 så er det ikke et lille bogstav. Så læser vi et nyt
jb read ; Jumo tilread og læs et nyt tegn hvis ascii værdien er "below" 61h
cmp byte [buffer], 7Bh ; Sammenlign. Hvis tegnet er mindre end 7Bh, vil vi skrive det ud
jb write ; Hop til write, hvis bufferen indeholder et tegn som er mindre end 7Bh
jmp read ; Hop til read og start forfra, lige meget hvad
write:
mov rax, 1 ; Forbered sys_write()
mov rdi, 1 ; Vi vil gerne skrive til filedescriptor 1, stdout
mov rsi, buffer ; ecx skal kende adressen som bufferen har. Her er det tegn vi gerne vil skrive ud
mov rdx, 1 ; Dette er antal bytes vi gerne vil skrive med sys_write()
syscall ; Kald kernens 80h vector og lad den udføre sys_write()
jmp read ; Hop til read lige meget hvad. Vi vil læse det næste tegn, eller kontrollere om der er mere input
exit:
mov rax,60 ; Systemkaldet til exit()
mov rdi,0 ; Returkoden til operativsystemet
syscall ; Udfør systemkaldet exit(). Eksekveringen må ikke fortsætte længere end her til
32 bit udgave
Kode:
;title "cho"
;********************************************************
;* Filnavn: cho.asm *
;* Author: iTick *
;* Version: 1.0 *
;* Kernel: 2.6-32-5-amd64 *
;* Dist: Debian (Squeeze) *
;* Initial Date: 2. Oktober 2013 *
;* Purpose: Filtrere alt andet en alfanummerisk fra *
;********************************************************
; Dette program compiles og linkes som nedenstående: *
; nasm -f elf32 ./cho.asm -o ./cho.o -g -Z ./errors.log *
; ld -o ./cho ./cho.o for 64bit version *
; ld -o ./cho ./cho.o -melf_i386 for 32 bit version
; Notes: *
; mov ecx, buffer tager adressen, hvor *
; cmp byte [buffer], 30h tager indholdet *
;********************************************************
BITS 32 ; Brug 32 bits. Dette er et 32 bit eksempel. IA32 er Intel Architecture 32 bit .
GLOBAL _start ; Entry point til ELF linkeren (Det er her, eksekveringen starter)
SECTION .data ; Start af data area
SECTION .bss ; Her lægger vi vores uninitialized data.
buffer resb 1
SECTION .text ; Start af code block. Selve assembler koden skal placeres her under
_start:
nop
read:
mov eax, 3 ; Forbered sys_read() kald
mov ebx, 0 ; POSIX filedescriptor stdin
mov ecx, buffer ; Kopier adressen på buffer til ecx
mov edx, 1 ; Læs en enkelt byte fra den valgte filedescriptor stdin
int 80h ; Overgiv kontrollen til kernen og lad den udføre sys_read()
cmp eax, 0 ; Læs returkoden fra sys_read() kaldet. Sammenlign returkoden med 0
je exit ; Hvis de er ens, hoppes der til exit. 0 betyder EOF
; Kontroller om det er mellemrum. 20h
cmp byte [buffer], 20h ; Kontroller om bufferen indeholder hex værdien for ascii tegnet mellemrum
je write ; Hvis det er ascii 20h, er det mellemrum. Så hop til write. je er Jump Equal
; Komtroller ascii værdierne 0-9
cmp byte [buffer],30h ; Sammenlign den læste værdi med 30h (ascii tallet 0, som i 2, 1, 0)
jb read ; Hvis den er mindre end 0 er det et speciel tegn. Så springer vi til read og læser et nyt tegn
cmp byte [buffer],3Ah ; Hvis vi er kommet her til og vi er laver end hex 3A, er det et tal. Det skriver vi ud
jb write ; Brug jb Jump Below til at hoppe til write.
; kontroller ascii værdierne A-Z
cmp byte [buffer], 41h ; Sammenlign den læste værdi med 41h (A), hvis den er mindre, er det ikke et bogstav
jb read ; Hvis ascii tegnet var mindre, så hop til read
cmp byte [buffer], 5Bh ; Hvis den er mindre end 5B har vi ramt i ascii range med store bogstaver. Det vil vi udskrive
jb write
; Kontroller ascii værdierne a-z
cmp byte [buffer], 61h ; Hvis værdien er mindre end 61 så er det ikke et lille bogstav. Så læser vi et nyt
jb read ; Jumo tilread og læs et nyt tegn hvis ascii værdien er "below" 61h
cmp byte [buffer], 7Bh ; Sammenlign. Hvis tegnet er mindre end 7Bh, vil vi skrive det ud
jb write ; Hop til write, hvis bufferen indeholder et tegn som er mindre end 7Bh
jmp read ; Hop til read og start forfra, lige meget hvad
write:
mov eax, 4 ; Forbered sys_write()
mov ebx, 1 ; Vi vil gerne skrive til filedescriptor 1, stdout
mov ecx, buffer ; ecx skal kende adressen som bufferen har. Her er det tegn vi gerne vil skrive ud
mov edx, 1 ; Dette er antal bytes vi gerne vil skrive med sys_write()
int 80h ; Kald kernens 80h vector og lad den udføre sys_write()
jmp read ; Hop til read lige meget hvad. Vi vil læse det næste tegn, eller kontrollere om der er mere input
exit:
mov eax,1 ; Systemkaldet til exit()
mov ebx,0 ; Returkoden til operativsystemet
int 0x80 ; Udfør systemkaldet exit(). Eksekveringen må ikke fortsætte længere end her til