gpt4 book ai didi

linux - Hello World 通过一个系统调用打印两条消息?为什么 length equ $-msg1 包括两者?

转载 作者:行者123 更新时间:2023-12-02 18:08:57 25 4
gpt4 key购买 nike

section.text:
global _start

_start:
mov ebx, 1
mov eax, 4
mov ecx, msg1
mov edx, len1
int 0x80

mov eax, 1 ; exit
mov ebx, 0
int 0x80


section.data:
msg1: db "Hello world", 10
msg2: db "Hello world!", 10
len1: equ $-msg1
len2: equ $-msg2

它打印出: Hello World Hello World !但为什么msg 2?

最佳答案

len1 填充不正确,应该是:

section  .rodata        ; space needed between section directive and its operand
; On Linux we normally put read-only data in .rodata

msg1: db "Hello world", 10
len1: equ $-msg1
msg2: db "Hello world!", 10
len2: equ $-msg2

因此,len1 是当前地址 ($) 与 msg1 的地址之间的差值。这样它将是第一条消息的长度。

参见How does $ work in NASM, exactly?了解更多详细信息和示例。


请注意,section.data: 只是一个定义符号名称的标签,中间有一个点。它不会切换部分,因此您的代码和数据位于 .text 部分(具有只读 + 执行权限),这是 文件顶部的默认部分nasm -f elf32 输出。

如果您希望在不执行执行的情况下进行读+写,请使用 section .data,如果您希望在 Linux 上进行只读操作,请使用 section .rodata无需 exec,编译器将字符串文字和其他常量放在一起,与代码分开。

关于linux - Hello World 通过一个系统调用打印两条消息?为什么 length equ $-msg1 包括两者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72690806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com