Program dikompilasi, tetapi macet setelah dimulai. Jika ganti format dan sertakan dengan versi 32-bit atau komentari MessageBox, maka semuanya berfungsi dengan baik.

format PE64 GUI

include 'E:\Fresh\include\win64a.inc'

entry start

section '.data' data readable writeable

        text db 'Hello world!',0

section '.text' code readable executable
start:
        invoke MessageBox,0,text,text,0
        invoke ExitProcess,0

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL', user32, 'USER32.DLL'
        import kernel32, ExitProcess, 'ExitProcess'
        import user32, MessageBox, 'MessageBoxA'  
1
rancid_rot 9 Maret 2020, 19:11

1 menjawab

Jawaban Terbaik

Tumpukan Anda tidak selaras dengan 16 byte, seperti ABI membutuhkan. Tambahkan and rsp, -16 ke awal kode Anda, dan itu akan berhasil.

Mengenai pertukaran ini di komentar:

Ruslan: Seperti apa pembongkarannya? Apakah makro invoke diperluas seperti yang diharapkan?

rancid_rot: Tidak yakin, ada MessageBox di cs bukan ds. Dan mov rcx,0 sebagai gantinya Dorong 0.

Saya akan merekomendasikan untuk menghindari invoke dan makro serupa sampai Anda mempelajari apa yang harus diperluas. Kalau tidak, Anda pikir Anda menulis dalam perakitan, tetapi sebenarnya Anda menulis dalam bahasa tingkat tinggi yang hanya menyerupai perakitan, bahkan tidak tahu kode apa yang akan Anda dapatkan pada akhirnya — sehingga menentang seluruh tujuan menggunakan assembler.

Untuk benar-benar belajar memanggil fungsi dalam perakitan Win64, lihat dokumentasi tentang konvensi pemanggilan Win64.

5
Community 20 Juni 2020, 09:12