White_Forest

NASM read one char and read word from stdin

Nov 5th, 2021 (edited)
1,476
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Читает один символ из stdin и возвращает его. Возвращает 0 если достигнут конец потока
  2. read_char:
  3.     xor rax, rax
  4.     xor rdi, rdi
  5.     push 0        
  6.     mov rsi, rsp  
  7.     mov rdx, 1  
  8.     syscall
  9.     pop rax
  10.     cmp rax, 0x0          ; код перевода строки
  11.     jz .return_0
  12.     ret
  13.  
  14.     .return_0:
  15.         mov rax, 0
  16.         ret
  17.  
  18. ; Принимает: адрес начала буфера, размер буфера
  19. ; Читает в буфер слово из stdin, пропуская пробельные символы в начале, .
  20. ; Пробельные символы это пробел 0x20, табуляция 0x9 и перевод строки 0xA.
  21. ; Останавливается и возвращает 0 если слово слишком большое для буфера
  22. ; При успехе возвращает адрес буфера в rax, длину слова в rdx.
  23. ; При неудаче возвращает 0 в rax
  24. ; Эта функция должна дописывать к слову нуль-терминатор
  25.  
  26. read_word:
  27.     push r12                ; callee-saved register
  28.     mov r9,rdi              ; pointer where is the next character written to
  29.     xor r11,r11             ; index (at the end is the length)
  30.     mov r12,rdi
  31.    
  32.     .skip_tabs:
  33.         push r11
  34.         push rsi
  35.         call read_char
  36.         pop rsi
  37.         pop r11
  38.         cmp rax, 0x0        ; null
  39.         je .end
  40.         cmp rax, 0x20       ; пробел
  41.         je .skip_tabs
  42.         cmp rax, 0x9        ; табуляция
  43.         je .skip_tabs
  44.         cmp rax, 0xA        ; перевод строки
  45.         je .skip_tabs
  46.         mov [r9], rax
  47.         inc r9b              ; next symbol
  48.         inc r11             ; index (length)++
  49.    
  50.     .read_symbol:
  51.         cmp rsi, r11         ; if (size == 0) return 0
  52.         je .return_0
  53.         push r11            ; caller-saved, syscall changes the value
  54.         push rsi
  55.         call read_char
  56.         pop rsi
  57.         pop r11
  58.         cmp rax, 0x0        ; null
  59.         je .end
  60.         cmp rax, 0x20       ; пробел
  61.         je .end
  62.         cmp rax, 0x9        ; табуляция
  63.         je .end
  64.         cmp rax, 0xA        ; перевод строки
  65.         je .end
  66.         mov [r9], rax
  67.         inc r9b             ; next symbol
  68.         inc r11             ; index (length)++
  69.         jmp .read_symbol
  70.        
  71.     .return_0:
  72.         mov rdx, 0
  73.         pop r12
  74.         mov rax, 0
  75.         ret
  76.  
  77.     .end:
  78.         ; mov byte[r9], 0
  79.         mov rdx, r11
  80.         mov rax, r12
  81.         pop r12
  82.         ret
Add Comment
Please, Sign In to add comment