Asembler stos błąd "illegal instruction"

0

Oto program z którym mam problem:

format ELF64 executable
entry _start

segment readable executable

_start:
	
	push eax
	pop eax
	
	mov rax, 60
	mov rdi, 0
	syscall

Przy kompilacji wyświetla się: error: illegal instruction. Dla AX i RAX działa, tylko z EAX jest problem. Tak samo z rejestrami BX i pewnie innymi.

2

Tak, bo taka instrukcja nie istnieje:

       PUSH - PUSH WORD, DOUBLEWORD OR QUADWORD ONTO THE STACK

       ┌────────┬─────────────┬───────┬─────────────┬─────────────────┬─────────────┐
       │Opcode* │ Instruction │ Op/En │ 64-Bit Mode │ Compat/Leg Mode │ Description │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │FF /6   │ PUSH r/m16  │ M     │ Valid       │ Valid           │ Push r/m16. │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │FF /6   │ PUSH r/m32  │ M     │ N.E.        │ Valid           │ Push r/m32. │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │FF /6   │ PUSH r/m64  │ M     │ Valid       │ N.E.            │ Push r/m64. │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │50+rw   │ PUSH r16    │ O     │ Valid       │ Valid           │ Push r16.   │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │50+rd   │ PUSH r32    │ O     │ N.E.        │ Valid           │ Push r32.   │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │50+rd   │ PUSH r64    │ O     │ Valid       │ N.E.            │ Push r64.   │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │6A ib   │ PUSH imm8   │ I     │ Valid       │ Valid           │ Push imm8.  │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │68 iw   │ PUSH imm16  │ I     │ Valid       │ Valid           │ Push imm16. │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │68 id   │ PUSH imm32  │ I     │ Valid       │ Valid           │ Push imm32. │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │0E      │ PUSH CS     │ ZO    │ Invalid     │ Valid           │ Push CS.    │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │16      │ PUSH SS     │ ZO    │ Invalid     │ Valid           │ Push SS.    │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │1E      │ PUSH DS     │ ZO    │ Invalid     │ Valid           │ Push DS.    │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │06      │ PUSH ES     │ ZO    │ Invalid     │ Valid           │ Push ES.    │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │0F A0   │ PUSH FS     │ ZO    │ Valid       │ Valid           │ Push FS.    │
       ├────────┼─────────────┼───────┼─────────────┼─────────────────┼─────────────┤
       │0F A8   │ PUSH GS     │ ZO    │ Valid       │ Valid           │ Push GS.    │
       └────────┴─────────────┴───────┴─────────────┴─────────────────┴─────────────┘

masz tutaj napisane, że w przypadku 64 bitowego trybu, PUSH r32 nie jest poprawna. Podobnie z POP.
Reference:
https://www.felixcloutier.com/x86/push

0

Da się to jakoś obejść? Jak wrzucać na stos dane 32-bitowe?

0

Ale po co chcesz to robić? Wrzuć wartość 64-bitową i się nie przejmuj,

0

Push:

sub rsp, 4
mov dword [rsp], eax

1 użytkowników online, w tym zalogowanych: 0, gości: 1