Проблема с созданием подпрограммы для динамического вывода строки без использования стека в 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 "hello world",0
output2 db "again hello world",0

section .bss

section .text
global _start

_start:
mov rcx,output1
call _output
call _exit

_output:
mov rbx,0

_length_loop:
inc rbx
inc rcx
mov dl,[rcx]
cmp dl,0
jne _length_loop

_system_call:
mov rax,1
mov rdi,1
mov rsi,rcx
mov rdx,rbx
syscall
ret

_exit:
mov rax,60
mov rdi,0
syscall
ret

но, к моему удивлению, он вывел «снова ад», так что кажется, что выход1-output-call печатает символы вывода2, но я даже не сделал выходной вызов из вывода2, но по какой-то причине он принимает правильную длину вывода1 в регистре rbx, но принимает неправильные байты для rcx, но тогда эта доза не имеет смысла, потому что длина в rbx рассчитывается в прямой зависимости от rcx, что означает, что если rcx или значение неверно, rbx или длина также должны быть неправильными, но это не так, поэтому я попробовал отладку через GDB, и это показало следующее: -

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

(gdb) info function
All defined functions:

Non-debugging symbols:
0x0000000000401000  _start
0x0000000000401014  _output
0x0000000000401019  _length_loop
0x0000000000401026  _system_call
0x0000000000401039  _exit
(gdb) break _system_call
Breakpoint 1 at 0x401026
(gdb) run
Starting program: /home/maybe/code/x86/linux/test2

This GDB supports auto-downloading debuginfo from the following URLs:

Enable debuginfod for this session? (y or [n]) y
Debuginfod has been enabled.
To make this setting permanent, add 'set debuginfod enabled on' to .gdbinit.

Breakpoint 1, 0x0000000000401026 in _system_call ()
(gdb) info register rbx
rbx            0xb                 11
(gdb) info register rcx
rcx            0x40200b            4202507

это действительно показывает, что регистр rbx правильный, но значение в регистре rcx равно 4202507, что в ascii переводится в «ú» (примечание: я перевел значение ascii, используя случайное десятичное число, в ascii веб-сайт в Интернете), но тогда это означает, что я что-то неправильно истолковал, потому что эта доза не соответствует тексту на экране.>

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

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

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

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

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

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