Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Szyfr Cezara
- # %dl klucz dla liter
- # %dh klucz dla liczb
- .data
- SYSREAD = 0
- SYSWRITE = 1
- SYSEXIT = 60
- STDIN = 0
- STDOUT = 1
- EXIT_SUCCESS = 0
- EXIT_ERR = 1
- BUFLEN = 512
- KEY = 53
- ZCODE = 0x30 # zero code
- NCODE = 0x3A # nine code + 1
- BACODE = 0x41 # A code
- BZCODE = 0x5B # Z code + 1
- SACODE = 0x61 # a code
- SZCODE = 0x7B # z code + 1
- LETTER_FIX = 26
- NUMBER_FIX = 10
- key: .ascii "26"
- key_len = .-key
- err_msg: .ascii "Klucz zawiera niedozwolone znaki\n"
- err_msg_len = .-err_msg
- .bss
- .comm textin, 512
- .comm textout, 512
- .comm lkey, 1
- .comm nkey, 1
- .text
- .global main
- main:
- nop
- movq $SYSREAD, %rax
- movq $STDIN, %rdi
- movq $textin, %rsi
- movq $BUFLEN, %rdx
- syscall
- movq $0, %rdx
- movq %rax, %r8
- dec %r8 # pokazuje na '\n'
- movq $0, %rdi # licznik
- make_key:
- # %cl znak
- # %r10 wartosc klucza
- movb $10, %al
- movw $0, %cx
- movb key(,%rdi,1), %cl
- cmp $ZCODE, %cl
- jl err_end
- cmp $NCODE, %cl
- jge err_end
- subw $ZCODE, %cx
- movw %r10w, %dx
- mulw %dx
- movw %ax, %dx
- addw %cx, %dx
- addw %dx, %r10w
- inc %rdi
- cmp $key_len, %rdi
- jne make_key
- #dzielenie klucza
- movq $0, %rdx
- movq %r10, %rax
- movq $26, %rbx
- divq %rbx
- movq %rdx, %r11
- movq $0, %rdx
- movw %r10w, %ax
- movw $10, %bx
- divw %bx
- movw %dx, %r12w
- movq $0, %rdi
- loop:
- cmp %rdi, %r8
- je end
- movb textin(,%rdi, 1), %cl # n
- # 0<n<9 ?
- movb $ZCODE, %bl
- movb $NCODE, %bh
- cmp %cl, %bl
- jg no_change
- cmp %cl, %bh
- jg change_number
- # A<n<Z ?
- movb $BACODE, %bl
- movb $BZCODE, %bh
- cmp %cl, %bl
- jg no_change
- cmp %cl, %bh
- jg change_letter
- jmp no_change
- change_letter:
- add %r11b, %cl
- # n>Z?
- cmp $'Z', %cl
- jg letter_overflow
- movb %cl, textout(,%rdi, 1)
- inc %rdi
- jmp loop
- letter_overflow:
- subb $LETTER_FIX, %cl
- # n>Z?
- cmp $'Z', %cl
- jg letter_overflow
- movb %cl, textout(,%rdi, 1)
- inc %rdi
- jmp loop
- change_number:
- add %r12b, %cl
- # n>9?
- cmp $'9', %cl
- jg number_overflow
- movb %cl, textout(,%rdi, 1)
- inc %rdi
- jmp loop
- number_overflow:
- subb $NUMBER_FIX, %cl
- # n>9?
- cmp $'9', %cl
- jg number_overflow
- movb %cl, textout(,%rdi, 1)
- inc %rdi
- jmp loop
- no_change:
- movb %cl, textout(,%rdi,1)
- inc %rdi
- jmp loop
- end:
- movb $'\n', textout(,%rdi,1)
- movq $SYSWRITE, %rax
- movq $STDOUT, %rdi
- movq $textout, %rsi
- movq $BUFLEN, %rdx
- syscall
- movq $SYSEXIT, %rax
- movq $EXIT_SUCCESS, %rdi
- syscall
- err_end:
- movq $SYSWRITE, %rax
- movq $STDOUT, %rdi
- movq $err_msg, %rsi
- movq $err_msg_len, %rdx
- syscall
- movq $SYSEXIT, %rax
- movq $EXIT_ERR, %rdi
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement