Переделал свой пример без использования стека вообще.
В случае успеха приложение должно просто штатно завершиться.
Code:
ORG 0
BITS 32
MEMORY_BUFFER_SIZE equ 1024 * 1024 * 64
; ------------------------------------------------- ;
MENUET01 db 'MENUET01'
version dd 1
program.start dd START
program.end dd END
program.memory dd END
program.stack dd END
program.params dd 0
program.path dd 0
; ------------------------------------------------- ;
START:
mov edi, MemoryBuffer
mov ecx, MemoryBuffer.end - MemoryBuffer
xor eax, eax
repe scasb
je .ok
mov eax, 0xBADC0DE
int3
.ok:
; ------------------------------------------------- ;
mov eax, -1
int 64
; ------------------------------------------------- ;
SECTION .bss
MemoryBuffer:
resb MEMORY_BUFFER_SIZE
.end:
END:
Иначе срабатывает
int3 и в
eax должно оказаться
0xBADC0DE.
Похоже, действительно, раньше показывало "не нуль" на стеке, а теперь всё нормально.
Но есть проблема: если запустить сразу несколько копий(нажать
Enter в Файловом менеджере и удерживать), то в
BOARD будет:
Code:
K : Process - forced terminate PID: 00000053 [testmem]
K : General protection fault
K : EAX : 0BADC0DE EBX : 00000000 ECX : 03FFF043
K : EDX : 00000000 ESI : 00000000 EDI : 00001001
K : EBP : 00000000 EIP : 00000039 ESP : 04000044
K : Flags : 00011297 CS : 0000001B (application)
То есть,
int3 в этом случае всё же сработало.
Тестировал в
VirtualBox с 256 Mb RAM.