【问题标题】:Understanding some Assembly "Hello World" code: equ $ - msg1 prints both messages?了解一些汇编“Hello World”代码: equ $ - msg1 打印两条消息?
【发布时间】:2021-01-14 21:36:49
【问题描述】:

我有以下汇编代码:

section .text
      global _start
_start:
       mov edx,len2
       mov ecx,msg1
       mov ebx,1
       mov eax,4
       int 0x80     ; write(1, msg1, len2)
       mov eax,1  ;system call number (sys_exit) 
       int 0x80   ;call kernel

section  .data

   msg1 db   'Hello '
   len1 equ  $ - msg1
   msg2 db   'world!',0xa
   len2 equ  $ - msg1

有人告诉我,这段代码应该打印“Hello World!”但我不明白为什么?

当我第一次看到它时,我确信它应该只打印“Hello”。 有人可以帮我理解一下吗?

【问题讨论】:

  • len2 被定义为$ - msg1 而不是$ - msg2,因此它也包括Hello 的长度。
  • @Jester 谢谢!
  • 请勿贴代码图片!相反,始终将代码作为文本发布。我对您的问题投了反对票,一旦您edit 您的问题并将您的图片更改为文本,我将撤回反对票。
  • @fuz 我已编辑问题并将代码添加为文本。
  • @none 非常感谢。

标签: assembly x86 nasm


【解决方案1】:

正如@Jester 在评论中所说,原因是len2 被定义为$ - msg1 而不是$ - msg2,因此它也包括Hello 的长度。

【讨论】:

  • 相关:How does $ work in NASM, exactly?。您问题中的代码看起来像是故意的技巧/混淆:将 len2 定义为总长度,但称其为 len2 非常奇怪。所以第二部分的实际长度是len2 - len1,如果您只想打印“世界!”,就需要它。部分。
  • @PeterCordes 是的,这是我正在学习的关于装配的先前考试中的一个问题。
  • 好的,但如果我在现实生活中看到过这样的代码,我会通过将 len2 重命名为 len_total 来修复它。正如所写,这是故意误导命名,以至于我认为它是一个错误。 IDK 是否是一个很好的考试问题。在代码中使用 len2msg1 确实鼓励您仔细查看它们的定义方式,而不是假设它们是按照您期望的方式定义的(作为相应消息编号的长度)。
猜你喜欢
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 2022-10-18
  • 1970-01-01
相关资源
最近更新 更多