吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 585|回复: 13
收起左侧

[学习记录] 最近看汇编书,看到一个能正常编译的 Hello World 汇编版

[复制链接]
hongwenjun 发表于 2024-11-16 21:52
第一步都是创建一个简单的汇编语言源文件。创建文件 hw64.asm
[Asm] 纯文本查看 复制代码
includelib 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 [rsp + 4 * 8], 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 微软汇编器,输入以下命令:
[Shell] 纯文本查看 复制代码
ml64 hw64.asm /link /subsystem:console /entry:main

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
axiosdidi + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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 老师也讲过这个东西 推荐看一下 NJU 的蒋岩炎老师的 OS 课程,前几节课有讲怎么实现一个最小的 hello world
52pojiewuai 发表于 2024-11-17 08:26
汇编语言不好懂,不过学会了就知道其中的原理了,没看过汇编语言的书籍,只是听说过,有机会了解一下
仧小张 发表于 2024-11-17 08:34
用c++ 看汇编
进一步  可以用java看
hsmx77 发表于 2024-11-17 08:36
上学的时候开过汇编课,当年学得很带劲,考得也不错,怎么现在看起来像天书
王诚 发表于 2024-11-17 09:11
谢谢楼主。。。。。。
 楼主| hongwenjun 发表于 2024-11-17 12:41
hsmx77 发表于 2024-11-17 08:36
上学的时候开过汇编课,当年学得很带劲,考得也不错,怎么现在看起来像天书

汇编代码有好多种, C51单片机汇编  X86汇编 是不同的。
MSVC 和  GCC 又不同的。还有 AMD64  ARM   MIPS RISCV 也各不相同。
hsmx77 发表于 2024-11-17 13:14
hongwenjun 发表于 2024-11-17 12:41
汇编代码有好多种, C51单片机汇编  X86汇编 是不同的。
MSVC 和  GCC 又不同的。还有 AMD64  ARM   MIP ...

那年头儿哪有那么复杂,486算是高端机器了,只有z80 和 X86
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 06:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表