马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 孤星1119 于 2021-10-2 09:01 编辑
我来啦!首先给大家介绍"Hello World"在Win32 汇编怎么写。
具体用的是FASM (flat assembler),虽然流行的也包括NASM,请注意区别并不在于CPU指令部分。
譬如, FASM可能会用:
- entry start
- section '.code' code executable readable
- start:
- ......
- ......
复制代码
但是NASM可能会用:
- global _start
- section .text
- _start:
- ......
- ......
复制代码
代码还是一样的。
不管是Windows还是Linux,最基本的可执行文件结构主要由Data Segment/Section(数据段)和Code Segment/Section(代码段)组成,但是Windows还多一样才能发挥功能,就是Import Table(就是示例中下方的Kernel32.dll那些).
- format PE console
- entry start
- include 'win32a.inc'
- section '.data' readable writable
- _message db 'Hello World!',13,10,0
- _msglen = $ - _message1
- _dummy dd ?
- section '.code' code readable writable executable
- start:
- invoke GetStdHandle, -11
- invoke WriteConsole, eax, _message, dword [_msglen], _dummy, 0
- invoke ExitProcess,0
- section '.idata' import readable writable
- library kernel32, 'KERNEL32.DLL'
- import kernel32,\
- GetStdHandle, 'GetStdHandle', \
- ReadConsole, 'ReadConsoleA', \
- WriteConsole, 'WriteConsoleA', \
- ExitProcess,'ExitProcess'
复制代码
参考资料
Win32 API:
https://docs.microsoft.com/en-us/windows/console/writeconsole
https://docs.microsoft.com/en-us ... eadsapi-exitprocess
另外,提醒一下,Windows的换行符是13+10(\r\n),而Linux只是10(\n)或0xA,这就是“Hello World"后面的换行符在两个操作系统都不一样的缘故。虽然如此,0x0(null)在尾端表示终止符。
最近玩Linux编程比较多,因此重点将会放在Linux的ELF64(虽然也有ELF32).
这是Linux x64的"Hello World"示例,比Windows的简单得多吧?
两者概念一样,都有一个File Descriptor,如果用作显示屏,就有StdIn和StdOut.
- format ELF64 executable 3
- segment readable executable
- entry $
- mov rdx,_msglen
- lea rsi,[_message]
- mov rdi,1 ; STDOUT
- mov rax,1 ; sys_write
- syscall
- xor rdi,rdi
- mov rax,60 ; sys_exit
- syscall
- segment readable writeable
- _message db "Hello World!",10,0
- _msglen = $ - _message
复制代码
参考资料
Syscall: https://chromium.googlesource.co ... nstants/syscalls.md
Syscall x64 : 从0到3
每个不同的CPU(ARM,ARM64, x86, x64)都有不同的特定参数排列。
如arg0...arg5,r开头的内部寄存器属于64位(rax),e开头的内部寄存器属于32位(eax),没有e或r开头的属于16位(ax),l结尾的属于8位(al)。
大家也可以在Linux终端窗口输入”man 2 <syscall function>"如图所示:
man是manual的意思吧?
当然也有网页版本:
https://www.kernel.org/doc/man-pages/
好了,大概是这么多。我的中文电脑术语有限,还望指正。谢谢大家耐心跟贴,希望你也能获益一点,Assembly(汇编)其实很吸引人的。
|