孤星1119 发表于 2021-10-2 08:57:16

汇编“Hello World"介绍帖

本帖最后由 孤星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:

      invokeGetStdHandle, -11
      invokeWriteConsole, eax, _message, dword , _dummy, 0

      invokeExitProcess,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,
      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(汇编)其实很吸引人的。

james007 发表于 2021-10-2 09:10:06

不懂啊,孤星

simonzhd 发表于 2021-10-2 09:26:27

谢谢孤星的仔细讲解,很专业,还有“参考资料”,真是用心了,稍微有点头绪了。先收藏了,哪天空的时候在研究一下~

孤星1119 发表于 2021-10-2 09:43:04

simonzhd 发表于 2021-10-2 09:26
谢谢孤星的仔细讲解,很专业,还有“参考资料”,真是用心了,稍微有点头绪了。先收藏了,哪天空的时候在研 ...

十分感谢站长加精,而且你还收藏了,真的是宠坏我了,不过也鼓励了我应该分享知识,不仅一昧顾着积累知识为了荣誉。

孤星1119 发表于 2021-10-2 09:45:02

james007 发表于 2021-10-2 09:10
不懂啊,孤星

C其实和汇编相当接近,你慢慢来就会培养兴趣了。

孤星1119 发表于 2021-10-8 19:56:33

我另外制作的此介绍贴的HTML版本,欢迎打开看一看。






页: [1]
查看完整版本: 汇编“Hello World"介绍帖