hongwenjun 发表于 2024-11-16 21:52

最近看汇编书,看到一个能正常编译的 Hello World 汇编版

第一步都是创建一个简单的汇编语言源文件。创建文件 hw64.asmincludelib kernel32.lib

extrn __imp_GetStdHandle:proc   ; 导入 GetStdHandle 函数
extrn __imp_WriteFile:proc      ; 导入 WriteFile 函数

.CODE
hwStr   byte    "Hello World!"; 定义一个字符串 "Hello World!"
hwLen   =       $-hwStr         ; 计算字符串长度

main    PROC
      
; 进入时,栈在 8 mod 16 对齐。为 "bytesWritten" 留出 8 字节,
; 确保 main 中的调用的栈对齐到 16 字节。

      lea   rbx, hwStr       ; 将字符串指针加载到 rbx
      sub   rsp, 8         ; 为 bytesWritten 留出空间
      mov   rdi, rsp         ; 在这里保存写入的字节数

; 注意:必须为 shadow registers 留出 32 字节 (20h) 的空间
; 参数(只需为所有函数做一次)。此外,WriteFile 有一个
; 第五个参数(为 NULL),因此我们必须留出 8 字节来存放
; 该指针(并初始化为零)。最后,栈必须始终保持 16 字节对齐,
; 所以再保留 8 字节的存储。

; 为参数的 shadow 存储(始终 30h 字节)。

      sub   rsp, 030h
      
; 句柄 = GetStdHandle(-11);
; 单个参数传递在 ECX 中。
; 句柄返回在 RAX 中。

      mov   rcx, -11      ; STD_OUTPUT 的值
      call    qword ptr __imp_GetStdHandle; 调用 GetStdHandle
               
; WriteFile(handle, "Hello World!", 12, &bytesWritten, NULL);
; 将 "LPOverlapped" 参数清零(设置为 NULL):

      mov   qword ptr , 0; 第五个参数在栈上
      
      mov   r9, rdi         ; 将 "bytesWritten" 的地址放到 R9
      mov   r8d, hwLen      ; 将要写入的字符串长度放到 R8D
      lea   rdx, hwStr      ; 将字符串数据的指针放到 RDX
      mov   rcx, rax      ; 文件句柄放到 RCX
      call    qword ptr __imp_WriteFile; 调用 WriteFile
      add   rsp, 38h      ; 清理栈空间
      ret                      ; 返回
main    ENDP
END

这个汇编源代码使用GPT改成中文注释的,你会看到第一行如下:includelib kernel32.libkernel32.lib是一个 Windows 库,其中包括此汇编语言程序使用的和函数。要编译(汇编)此文件,使用 微软 MSVC编译中 ml64.exe 微软汇编器,输入以下命令:ml64 hw64.asm /link /subsystem:console /entry:main

guanmfei 发表于 2024-11-16 22:13

如果是x86汇编,很推荐王爽的《汇编语言》

hongwenjun 发表于 2024-11-16 22:18

guanmfei 发表于 2024-11-16 22:13
如果是x86汇编,很推荐王爽的《汇编语言》

《64 位汇编语言艺术》(Ao64A)是 Randall Hyde 的经典著作《汇编语言艺术》的现代更新版。
这本全新的教材以 64 位 Intel/AMD x86-64 架构为特色,并教授在 Windows 下使用 Microsoft MASM 汇编器进行汇编语言编程。主题包括基本汇编语言编程和机器组织、整数运算、浮点运算、SIMD(SSE/AVX)编程、字符串和位操作。对于希望学习 x86-64 汇编语言编程的人来说,这是一本非常全面的书。

我看的是这本,前三章网上可以免费看中文版

zixiangcode 发表于 2024-11-17 08:04

看到 hello world,想起来了 jyy 老师也讲过这个东西{:301_1000:} 推荐看一下 NJU 的蒋岩炎老师的 OS 课程,前几节课有讲怎么实现一个最小的 hello world

52pojiewuai 发表于 2024-11-17 08:26

汇编语言不好懂,不过学会了就知道其中的原理了,没看过汇编语言的书籍,只是听说过,有机会了解一下

仧小张 发表于 2024-11-17 08:34

用c++ 看汇编
进一步可以用java看

hsmx77 发表于 2024-11-17 08:36

上学的时候开过汇编课,当年学得很带劲,考得也不错,怎么现在看起来像天书{:1_907:}

王诚 发表于 2024-11-17 09:11

谢谢楼主。。。。。。

hongwenjun 发表于 2024-11-17 12:41

hsmx77 发表于 2024-11-17 08:36
上学的时候开过汇编课,当年学得很带劲,考得也不错,怎么现在看起来像天书

汇编代码有好多种, C51单片机汇编X86汇编 是不同的。
MSVC 和GCC 又不同的。还有 AMD64ARM   MIPS RISCV 也各不相同。

hsmx77 发表于 2024-11-17 13:14

hongwenjun 发表于 2024-11-17 12:41
汇编代码有好多种, C51单片机汇编X86汇编 是不同的。
MSVC 和GCC 又不同的。还有 AMD64ARM   MIP ...

那年头儿哪有那么复杂,486算是高端机器了,只有z80 和 X86
页: [1] 2
查看完整版本: 最近看汇编书,看到一个能正常编译的 Hello World 汇编版