最近看汇编书,看到一个能正常编译的 Hello World 汇编版
第一步都是创建一个简单的汇编语言源文件。创建文件 hw64.asmincludelib kernel32.libextrn __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
如果是x86汇编,很推荐王爽的《汇编语言》 guanmfei 发表于 2024-11-16 22:13
如果是x86汇编,很推荐王爽的《汇编语言》
《64 位汇编语言艺术》(Ao64A)是 Randall Hyde 的经典著作《汇编语言艺术》的现代更新版。
这本全新的教材以 64 位 Intel/AMD x86-64 架构为特色,并教授在 Windows 下使用 Microsoft MASM 汇编器进行汇编语言编程。主题包括基本汇编语言编程和机器组织、整数运算、浮点运算、SIMD(SSE/AVX)编程、字符串和位操作。对于希望学习 x86-64 汇编语言编程的人来说,这是一本非常全面的书。
我看的是这本,前三章网上可以免费看中文版 看到 hello world,想起来了 jyy 老师也讲过这个东西{:301_1000:} 推荐看一下 NJU 的蒋岩炎老师的 OS 课程,前几节课有讲怎么实现一个最小的 hello world 汇编语言不好懂,不过学会了就知道其中的原理了,没看过汇编语言的书籍,只是听说过,有机会了解一下 用c++ 看汇编
进一步可以用java看 上学的时候开过汇编课,当年学得很带劲,考得也不错,怎么现在看起来像天书{:1_907:} 谢谢楼主。。。。。。 hsmx77 发表于 2024-11-17 08:36
上学的时候开过汇编课,当年学得很带劲,考得也不错,怎么现在看起来像天书
汇编代码有好多种, C51单片机汇编X86汇编 是不同的。
MSVC 和GCC 又不同的。还有 AMD64ARM MIPS RISCV 也各不相同。 hongwenjun 发表于 2024-11-17 12:41
汇编代码有好多种, C51单片机汇编X86汇编 是不同的。
MSVC 和GCC 又不同的。还有 AMD64ARM MIP ...
那年头儿哪有那么复杂,486算是高端机器了,只有z80 和 X86
页:
[1]
2