Я написал следующую программу на ассемблере, чтобы получить код операции различных регистров:
.section .text
.globl _start
_start:
add $1,%eax
add $1,%ebx
add $1,%ecx
add $1,%edx
add $1,%esp
add $1,%ebp
add $1,%esi
add $1,%edi
int $0x80
Я компилирую и связываю с:
gcc -c prog.s && ld prog.o
и дамп объекта:
0000000000400078 <_start>: 400078: 83 c0 01 add $0x1,%eax 40007b: 83 c3 01 add $0x1,%ebx 40007e: 83 c1 01 add $0x1,%ecx 400081: 83 c2 01 add $0x1,%edx 400084: 83 c4 01 add $0x1,%esp 400087: 83 c5 01 add $0x1,%ebp 40008a: 83 c6 01 add $0x1,%esi 40008d: 83 c7 01 add $0x1,%edi 400090: cd 80 int $0x80
Я ожидаю, что %ebx
будет иметь код операции c1
, но это не так. Итак, мой вопрос: почему c3
является кодом операции %ebx
для этих add
инструкций?
83 /0
add r/m32, imm8
а>. Поле/r
байта ModRM равно0
и используется как дополнительные биты кода операции. - person Peter Cordes   schedule 15.10.2018%use altreg
- person phuclv   schedule 15.10.2018