首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用NASM的尴尬数据部分行为

使用NASM的尴尬数据部分行为
EN

Stack Overflow用户
提问于 2015-05-21 22:27:24
回答 1查看 179关注 0票数 2

我正在编写一些汇编语言中的基本程序,在这些程序中,我只进行一些函数调用。我在OS上,使用Mach-O 64位格式.然而,我对数据部分的理解似乎有一个缺陷。据我了解,data部分用于初始化数据,我已决定初始化两个内存块,如下所示:

代码语言:javascript
运行
复制
default rel

global _main
extern _puts

section .data
    first db "Message A", 0 ; null terminator
    second db "Message B", 0

section .text

_main:
    push rbp ; alignment
    mov rbp, rsp
    sub rsp, 0x10
    lea rdi, [second]
    call _puts
    lea rdi, [first]
    call _puts
    add rsp, 0x10
    pop rbp
    ret

(很明显,我是在链接libc )

我的理解是,堆栈必须按照System规范对齐16字节。此外,rdi应该包含函数调用的第一个参数。

以上代码将打印“消息B",但无法直接打印”消息A“。好像“消息A”在某个地方被覆盖了。

同样有趣的是,当我在.text部分中输入这两个字符串时,代码按预期工作。由于.text是只读的,我几乎可以肯定,“消息A”在初始化后的某个时候会被覆盖。无论我在.data部分输入了多少字符串,我都只能打印最后一个字符串,而其他字符串只是简单地被覆盖。为什么最后一个字符串初始化为唯一未被覆盖的字符串?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-17 16:29:12

在这一刻,周围似乎没有太多的工作。这是2.11.08中的一个bug,我认为有些人也报告了2.11.06的问题,所以去2.11.05可能是最好的选择,或者等待2.11.09。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30385380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档