|
|||
6. Описание методов. 2. get_length_number. 3. output. 4. add_simple6. Описание методов
1. input: Делаем системный вызов 0 — чтение из консоли, результат кладём в input_expression. Длина считываемой строки из консоли — 256, положим в rdx.
; | input ; empty ; | output ; input_expression input: push rbx push rsi push rdx push rax xor rax, rax xor rsi, rsi xor rbx, rbx mov rsi, input_expression mov rdx, 256 syscall pop rax pop rdx pop rsi pop rbx ret
2. get_length_number На вход принимается указатель на буфер и сдвиг внутри него. rdx в «цикле» пробегает по сегменту буфера, начиная с символа rbx, пока не встречает спецсимвол «пустой строки».
; | input ; | rax - pointer buffer ; | rbx - shift ; | output ; | rax - length get_length_number: push rdx; мы будем использовать rdx в цикле в качестве итератора. Но rdx мог использоваться ранее push rcx xor rdx, rdx mov rcx, rax xor rax, rax add rbx, rdx mov rdx, rax mov rax, rcx . next_iter: cmp [rax + rdx], byte0 je. close inc rdx jmp. next_iter . close: sub rdx, rbx mov rax, rdx; поместим значение длины (это тот самый итератор rdx) в rax pop rcx pop rdx ret
3. output Четвёртый системный вызов — вывод на экран. По логике программы, результат умножения должен оказаться в нулевой ячейке сегментного буфера P.
; | input ; | empty ; | output ; | empty output: push rax push rdx push rbx push rcx mov rcx, P xor rbx, rbx call get_length_number mov rdx, rax mov rax, 4 mov rbx, 1 syscall pop rcx pop rbx pop rdx pop rax ret
4. add_simple На вход подаются односимвольные числа-строки в регистрах rax и rbx. В регистре rdx лежит число, значение которого равно текущему значению переноса. На выходе метод возвращает в rax — односимвольное число-строку, результат сложения, с учётом переноса, и в rdx 0 или 1 — флаг переноса. Метод вычитает ASCII символ нуля, чтобы получить численное значение односимвольных строк, после чего все три числа складываются между собой. В конце происходит установка флага переноса и обратное преобразование в строку.
; | input ; rax = first symbol ; rbx = second symbol ; rdx = shift ; output ; rax = result ; rdx = new shift add_simple: push rcx mov rcx, rax sub rcx, '0' mov rax, rcx mov rcx, rbx sub rcx, '0' mov rbx, rcx add rax, rbx add rax, rdx xor rdx, rdx cmp rax, 10 jge. more jmp. end . more: sub rax, 10 mov rdx, 1 . end: add rax, '0' pop rcx ret
|
|||
|