【问题标题】:Is resb 2 equivalent to resw 1?resb 2 是否等同于 resw 1?
【发布时间】:2020-04-21 07:42:01
【问题描述】:

在这段代码中:

    global _start
section .bss
    v1 resw 1
    v2 resb 2    ;array of 2 chars 
section .text
_start:
    mov word[v1],500
    mov word[v2],500

    mov rax,60
    mov rdi,0
    syscall

这段代码是否正确?
word[v1] 的工作方式是否与 word[v2] 相同?

我在 x86-64 Ubuntu 上使用 NASM。

【问题讨论】:

    标签: assembly x86-64 nasm


    【解决方案1】:

    是的,它们都保留了相同数量的内存(2 个字节),因此您可以使用 mov word[...], ... 安全地访问它们。

    请注意,这大致相当于在 C 中编写 uint8_t v1[2]uint16_t v2[1]。但 NASM 不强制类型,因此每个内存引用就像使用 C memcpy() 执行严格别名安全加载或存储传输 N 字节而不关心内存的 C 类型。

    如果您打算将分配的数据用作wordwords 的数组,我强烈建议您实际使用resw,以避免混淆和潜在的错误。

    【讨论】:

    • 对所有内容始终使用resb 并手动乘以元素大小以获得以字节为单位的大小也是完全可以的。 NASM 不像 MASM “变量”那样在标签和操作数大小之间进行任何魔术关联。但是是的,静态存储通常只使用一种方式来使用resX,其中 X 是适当的元素大小。
    猜你喜欢
    • 2019-11-11
    • 2017-12-05
    • 2019-12-23
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    相关资源
    最近更新 更多