main.asm 2.29 KB
Newer Older
Elizaveta Chernova's avatar
Elizaveta Chernova committed
1 2
%include "colon.inc"					
%include "words.inc"
Elizaveta Chernova's avatar
Elizaveta Chernova committed
3 4 5 6
%include "lib.h"
%define POINTER_SIZE 8
%define SYS_WRITE 1
%define FD_STDERR 1
Elizaveta Chernova's avatar
Elizaveta Chernova committed
7

Elizaveta Chernova's avatar
Elizaveta Chernova committed
8
section .bss
Elizaveta Chernova's avatar
Elizaveta Chernova committed
9

Elizaveta Chernova's avatar
Elizaveta Chernova committed
10
BUFFER: resb 256
Elizaveta Chernova's avatar
Elizaveta Chernova committed
11

Elizaveta Chernova's avatar
Elizaveta Chernova committed
12
section .rodata
Elizaveta Chernova's avatar
Elizaveta Chernova committed
13 14
not_found_msg: db "Ключ не найден", 0
limit_exceeded_msg: db "Ошибка ввода", 0
Elizaveta Chernova's avatar
Elizaveta Chernova committed
15
BUF_SIZE: db 255
Elizaveta Chernova's avatar
Elizaveta Chernova committed
16 17 18 19 20 21 22 23 24 25

global _start
section .text
					
print_error:     ; аналогичная функции print_string, но с выводом сообщения об ошибке в stderr
    push rdi     ; сохранить caller-saved регистры
    call string_length 
    pop rdi
    mov rsi, rdi 
    mov rdx, rax 
Elizaveta Chernova's avatar
Elizaveta Chernova committed
26 27
    mov rax, SYS_WRITE 
    mov rdi, FD_STDERR   ; дескриптор stderr
Elizaveta Chernova's avatar
Elizaveta Chernova committed
28
    syscall 
Elizaveta Chernova's avatar
Elizaveta Chernova committed
29
    call print_newline_err		
Elizaveta Chernova's avatar
Elizaveta Chernova committed
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
    ret

_start:							    
    mov rdi, BUFFER	  ; данные для функции read_word: в rdi адрес начала буфера, в rsi - размер буфера 				
    mov rsi, BUF_SIZE
    push rdi						
    call read_word
    pop rdi						
    test rax, rax        ; если после выполнения read_word в rax оказался 0, значит слово слишком большое для буфера
    je .error		 ; переход к выводу сообщения об ошибке			
    mov rdi, rax	 ; в rdi - адрес буфера				
    mov rsi, pointer     ; в rsi указатель на начало словаря
    call find_word	 					
    test rax, rax	 ; если ключ не найден, переход к выводу сообщения 					
    je .key_not_found				
Elizaveta Chernova's avatar
Elizaveta Chernova committed
45
    add rax, POINTER_SIZE		 ; если ключ найден, функция возвращает адрес начала вхождения в словарь				
Elizaveta Chernova's avatar
Elizaveta Chernova committed
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
    mov rdi, rax						
    push rax							
    call string_length					
    pop rdi		  					   
    add rdi, rax         ; адрес начала ключа + длина ключа					
    inc rdi							    
    call print_string	 ; вывод значения			
    jmp .end							

.error:							
    mov rdi, limit_exceeded_msg					
    call print_error
    jmp .end							

.key_not_found:						
    mov rdi, not_found_msg			
    call print_error
    jmp .end				

Elizaveta Chernova's avatar
Elizaveta Chernova committed
65 66
.end:							       	
    jmp exit
Elizaveta Chernova's avatar
Elizaveta Chernova committed
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85