Подумалось, что для понимания работы компьютера полезно бы иметь возможность, запуская какую-нибудь программу, глянуть последовательность выполняемых машинных команд, а также изменение содержимое регистров процессора. Стал искать такую тулзу, а нету. Имеющиеся отладчики слабо помогают.
Быстренько слепил самопальное решение, спасибо системному вызову ptrace(). К примеру, возьмём Hello World на линуксном ассемблере x86-64:
Быстренько слепил самопальное решение, спасибо системному вызову 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"
Вроде ничо так фунциклирует. Надо будет перепереть на другие архитектуры: arm64, arm32, riscv64.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.
