【发布时间】:2018-01-10 01:14:55
【问题描述】:
此程序(来自 Jonathan Bartlett 的 Programming From the Ground Up)循环使用 .long 存储在内存中的所有数字,并将最大的数字放入 EBX 寄存器中,以便在程序完成时查看。
.section .data
data_items:
.long 3, 67, 34, 222, 45, 75, 54, 34, 44, 33, 22, 11, 66, 0
.section .text
.globl _start
_start:
movl $0, %edi
movl data_items (,%edi,4), %eax
movl %eax, %ebx
start_loop:
cmpl $0, %eax
je loop_exit
incl %edi
movl data_items (,%edi,4), %eax
cmpl %ebx, %eax
jle start_loop
movl %eax, %ebx
jmp start_loop
loop_exit:
movl $1, %eax
int $0x80
我不确定(,%edi,4) 在这个程序中的用途。我读过逗号用于分隔,而 4 用于提醒我们的计算机数据项中的每个数字都是 4 个字节长。既然我们已经用 .long 声明了每个数字是 4 个字节,为什么还要在这里再做一次呢?另外,有人可以更详细地解释这两个逗号在这种情况下的用途吗?
【问题讨论】:
-
为什么要在这里再做一次? 因为这是汇编语言。一切都只是字节。如果您想加载重叠两个相邻数组元素的 4 个字节,您可以,因为 x86 支持未对齐加载。您可以自行编写每条指令,以完全完成它需要做的事情。
-
扩展彼得的评论:机器代码和 CPU 不关心您的来源,因此使用
long指令定义的字节信息对机器不可见。.long 0x12345678和.byte 0x78, 0x56, 0x34, 0x12都将产生完全相同的 4 字节长序列,因此在运行时无法判断这些字节是如何定义的或它们的目的是什么。这取决于正在运行的代码,以决定如何访问和使用它们。 (如果您在编程时想要“类型”,请使用 C++ 等高级语言,汇编有不同的目标,使机器可以按原样访问) -
这仍然很有趣,我删除了 4 和逗号,程序仍然可以正常工作,当我删除括号时,我得到一个“无效操作数”错误