【问题标题】:How to compare addresses in x86如何比较 x86 中的地址
【发布时间】:2015-11-13 11:52:53
【问题描述】:

下面是一个 x86 程序,用于从数字列表中查找最大数字。当到达结束地址时,我试图退出循环。 (在源码中标有data_ends:标签)。

# Program to find maximum number
# Program should end when an ending address is reached
.section .data
.globl data_items                   
data_items:
#These are the data items
.long 3,67,34,222,45,75,54,34,44,33,22,11,66
data_ends:
.section .text
.globl _start                        
_start:
movl $0, %edi                        
movl data_items(,%edi,4), %eax       
movl %eax, %ebx                      
start_loop:
incl %edi
# Problem in below line
cmpl data_items(,%edi,4), data_ends
je loop_exit
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

但是从下面的as 输出可以看出,cmpl data_items(,%edi,4), data_ends 行有一些问题。

user $ as maxNum.s -o maxNum.o
maxNum.s: Assembler messages:
maxNum.s:28: Error: too many memory references for `cmp'
user $

看起来cmpl 指令的语法错误。我该如何解决这个问题?

【问题讨论】:

    标签: x86 compare memory-address


    【解决方案1】:

    cmpl data_items(,%edi,4), data_ends 有两个内存操作数。 cmp 不像 lea。如果你给它一个内存操作数,它就会从中加载。

    cmp $(data_ends - data_items) / 4, %edi 应该可以解决问题。使用您的源代码,汇编为cmp $0xd,%edi。请注意,您不是比较地址,而是比较循环计数器(用作索引)和循环计数。

    如果您从寄存器中的指针开始,并且每次迭代将其递增 4,那么比较地址是有意义的。为此,您可以比较两个寄存器,或者一个寄存器和一个立即数。 (符号地址是一个编译时常量,可用作立即操作数。请记住,您需要的是地址本身,而不是那里存储的内容。)

    有关两种循环结构的示例(带偏移的索引与递增指针并与结束比较),请参阅my answer to another beginner question 中的两个代码块。

    此外,您应该将只读数据放在.rodata 部分,而不是.data。你应该缩进你的指令而不是你的标签。这有助于很多提高可读性。

    【讨论】:

    • 当我从寄存器中的指针开始,每次迭代将其递增 4 并将其与 $data_ends 进行比较时,它就起作用了。这实际上是我想做的。即比较地址。所以将此标记为正确答案。但是,您所说的技巧cmp $(data_ends - data_items) / 4, %edi 会导致segmentation fault: core dumped。我不知道为什么会出现分段错误。它看起来像是立即值和寄存器值之间的比较,根本没有内存访问。
    • @sps:两种方式都在比较寄存器和立即数。在一种情况下,立即数是指针,在另一种情况下,立即数是最大循环计数器值。如果您在执行cmp $(data_ends - data_items) / 4, %edi 时问题中的代码出现段错误,那么您在其他地方就有错误。使用调试器查看在哪里发生段错误,因为你是对的,指令本身不可能出错。 (您可以反汇编以仔细检查,就像我为确保语法有效所做的那样:P)
    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2015-07-16
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多