Бесконечный цикл при написании простой подпрограммы для вывода строки без стека в x86-64Linux

Ответить
Anonymous
 Бесконечный цикл при написании простой подпрограммы для вывода строки без стека в x86-64

Сообщение Anonymous »

У меня была подпрограмма для динамической печати строки без ручного указания длины строки в стиле Intel x86-64 с помощью следующего кода (со стеком): -

Код: Выделить всё

section .data
output1 db "hello world",10,0
output2 db "hello world again",10,0

section .bss

section .text
global _start

_start:
mov rax,output1
call _output

mov rax,output2
call _output

call _exit

_output:
_output_setup:
push rax
mov rbx, 0

_output_length_loop:
inc rax
inc rbx

mov cl,[rax]

cmp cl, 0
jne _output_length_loop

_output_output:
mov rax, 1
mov rdi, 1
pop rsi
mov rdx, rbx
syscall
ret

_exit:
mov rax, 60
mov rdi, 0
syscall
ret
но мне нужна была подпрограмма без стека, поэтому я попытался написать подпрограмму, чтобы сделать то же самое без использования стека, поэтому я сделал следующее: -

Код: Выделить всё

section .data
output1 db "print this string",10,0
output2 db "print this string again",10,0

section .text
global _start

_start:
mov rcx,output1
call _output
mov rcx,output2
call _output
call _exit

_output:
_output_setup:
mov rbx,0

_output_length_loop:
inc rbx
inc rcx

mov dl,[rcx]

cmp dl,0
jne _output_length_loop

_output_output:
mov rax,0
mov rdi,0
mov rsi,rcx
mov rdx,rbx
syscall
ret

_exit:
mov rax,60
mov rdi,0
syscall
ret
он ​​выполнился без ошибок, но когда я запустил исполняемый файл, по какой-то причине он завис, предположительно, он по какой-то причине создал бесконечный цикл, поэтому я слышал об инструменте под названием GDB для отладки, но, честно говоря, для меня это был беспорядок, но я провел построчный анализ регистров, но не смог понять причину вышеизложенного
мой построчный анализ: -

Код: Выделить всё

rcx     rbx     dl_
_start
b1                                                   - mov rcx, output1
- call _output

_output
0                        - mov rbx,0

_output_loop_length -0
1                        - inc rbx
ib1                          - inc rcx
p                    - mov dl,[rcx]
- cmp dl,0 (p != 0)
- jne _output_length_loop

_output_loop_length -1
2                        - inc rbx
ib1                          - inc rcx
r                    - mov dl,[rcx]
- cmp dl,0 (p != 0)
- jne _output_length_loop

...

_output_loop_length -2
3                        - inc rbx
ib1                          - inc rcx
0                            - mov dl,[rcx]
- cmp dl,0 (p == 0)
- jne _output_length_loop

...
b1 означает начальный байт

i перед b1 означает увеличенную позицию начального байта
Я подозреваю, что «inc rcx» каким-то образом создает бесконечный цикл, но я не уверен, почему, кроме того, у меня есть некоторая двусмысленность, связанная с соответствующей строкой.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -without-s
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»