Хелпикс

Главная

Контакты

Случайная статья





6. Описание методов. 2. get_length_number. 3. output. 4. add_simple



6. Описание методов

 

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

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.