Почему этот машинный код генерируется для inc qword [rsp]?

Рассмотрим эту сборку x64 NASM-синтаксиса:

inc qword [rax]
inc qword [rcx]
inc qword [rdx]
inc qword [rbx]
inc qword [rsp]
inc qword [rbp]
inc qword [rsi]
inc qword [rdi]

После сборки с помощью nasm (и линковки с помощью gnu ld) objdump -d сообщает следующее:

4000b0:       48 ff 00                incq   (%rax)
4000b3:       48 ff 01                incq   (%rcx)
4000b6:       48 ff 02                incq   (%rdx)
4000b9:       48 ff 03                incq   (%rbx)
4000bc:       48 ff 04 24             incq   (%rsp)
4000c0:       48 ff 45 00             incq   0x0(%rbp)
4000c4:       48 ff 06                incq   (%rsi)
4000c7:       48 ff 07                incq   (%rdi)

Код, сгенерированный для inc qword [rbp], имеет смысл, так как установлено поле mod. Однако я не могу понять, откуда берется 24 при сборке inc qword [rsp]. Я просматривал coder64 #xFF, и ничто там не подсказывает мне, что нужно генерировать 24. Я явно упускаю что-то на более высоком уровне.


person jli    schedule 29.09.2012    source источник


Ответы (1)


Отсутствует [RSP] байт ModR/M. Так что он использует [sib] ModR/M. Sib означает, что есть sib байт, а 0x24 — это sib байт для RSP.

person CrazyCasta    schedule 29.09.2012