vak: (Default)
[personal profile] vak
Подумалось, что для понимания работы компьютера полезно бы иметь возможность, запуская какую-нибудь программу, глянуть последовательность выполняемых машинных команд, а также изменение содержимое регистров процессора. Стал искать такую тулзу, а нету. Имеющиеся отладчики слабо помогают.

Быстренько слепил самопальное решение, спасибо системному вызову ptrace(). К примеру, возьмём Hello World на линуксном ассемблере x86-64:
#include <sys/syscall.h>
.text
.globl _start
_start:
mov $ SYS_write, %rax // syscall write(fd, message, size)
mov $1, %rdi // fd - stdout
lea message(%rip), %rsi // pointer to message
mov $13, %rdx // size
syscall
mov $ SYS_exit, %rax // syscall exit(status)
xor %rdi, %rdi // status - 0
syscall
message:
.ascii "Hello world!\n"
Запускаем:
Starting program: ./hello-amd64-linux
rsp = 0x7ffd8ce45cc0
cs = 0x33
ss = 0x2b
eflags = 0x200
0x0000000000401000: 48 c7 c0 01 00 00 00 mov rax, 1
rax = 0x1
eflags = 0x202
0x0000000000401007: 48 c7 c7 01 00 00 00 mov rdi, 1
rdi = 0x1
0x000000000040100e: 48 8d 35 15 00 00 00 lea rsi, [rip + 0x15]
rsi = 0x40102a
0x0000000000401015: 48 c7 c2 0d 00 00 00 mov rdx, 0xd
rdx = 0xd
0x000000000040101c: 0f 05 syscall
Hello world!
rax = 0xd
rcx = 0x40101e
r11 = 0x302
0x000000000040101e: 48 c7 c0 3c 00 00 00 mov rax, 0x3c
rax = 0x3c
0x0000000000401025: 48 31 ff xor rdi, rdi
rdi = 0
eflags = 0x246
0x0000000000401028: 0f 05 syscall
Process exited normally.
Вроде ничо так фунциклирует. Надо будет перепереть на другие архитектуры: arm64, arm32, riscv64.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org