【问题标题】:Can't understand value in %rax in simple Assembly x86在简单的汇编 x86 中无法理解 %rax 的值
【发布时间】:2018-12-29 20:08:54
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

typedef struct item {
    int low; int high; char label[16];
} Item;

typedef struct item_coll {
    size_t length; Item *items[];
} ItemColl;

extern char *find_first_in_range(ItemColl *ic, int rlow, int rhigh);

/*
char *find_first_in_range(ItemColl *ic, int rlow, int rhigh) {
    for (size_t i = 0; i < ic->length; i++)
        if (ic->items[i]->low >= rlow && ic->items[i]->high <= rhigh)
            return &ic->items[i]->label[0];
    return NULL;
}
* */

int main() {

    struct item fruits[] = {
        {10, 20, "Apple"},
        {12, 14, "Pear"},
        { 8, 12, "Banana"},
        { 2,  4, "Grape"},
        {15, 35, "Watermelon"}
    };


    struct item_coll *basket = malloc (sizeof *basket + 5 * sizeof *basket->items);
    basket->length = 5;

    for (size_t i = 0; i < 5; i++)  
        basket->items[i] = &fruits[i];

    char *label = find_first_in_range (basket, 12, 15);
    printf ("%s\n", label);

    free (basket);

    return 0;
}

我有这个 C 程序,目标是在汇编中创建 find_first_in_range 函数。现在我只是想在Apple 中找到10,但它在%rax 中给了我一个奇怪的值。

这是我在汇编中所做的:

    .globl find_first_in_range

# *ic   is passed in %rdi
# rlow  is passed in %rsi
# rhigh is passed in %rdx

find_first_in_range:
    mov %rdi, %rax

%rsi 持有12%rdx 持有15 这是我传入find_first_in_range (basket, 12, 15); 的左右界限,但%rax 不应该持有10 吗?从fruits[]的第一个元素开始。

我的另一个问题是如何访问,例如,basket 的长度?这是5

【问题讨论】:

    标签: c assembly x86-64


    【解决方案1】:

    ic 本身在%rdi 中:指针 指向ItemColl。所以ic-&gt;length,作为该结构中的第一个元素,是(在mov 之后)只是(%rax)(大概8 个字节长)。

    【讨论】:

    • 我不明白你在说什么。 %rax 持有ic-&gt;length 吗?
    • @Vegas:正如我所说,RAX 持有 指针。您使用括号(在 AT&T 语法中)来获取存储在该位置(或附近)的值。
    • mov %rdi, %rax 之后执行mov (%rax), %rax 完美无缺,但我不明白括号如何获取值以及为什么没有括号就无法工作。
    • 我也刚刚意识到我可以简单地做mov (%rdi), %rax
    • @Vegas:是的,它就是这么做的——我相信我说过。至于为什么,只是为指令选择合适的寻址模式的语法(而不是仅仅使用寄存器)。
    【解决方案2】:

    %rsi 持有12%rdx 持有15 这是我传入的左右界限 find_first_in_range (basket, 12, 15);,但不应该%rax 持有10?从fruits[]的第一个元素开始。

    为什么会这样?!您将 指针 传递给struct item_coll。你所拥有的是一个指向struct item_coll指针。然后你需要通过这个指针进行间接访问,得到lengthLEAbasket-&gt;items的地址,并通过这个间接访问指针指向的结构中的值.

    了解如何在汇编中执行操作以制作执行相同操作的简单 C 函数然后以足够高优化级别编译该函数的最佳方法(O2!) 然后去理解生成的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2013-02-25
      相关资源
      最近更新 更多