【问题标题】:Storing values from an array into a register (Assembly)将数组中的值存储到寄存器中(程序集)
【发布时间】:2013-11-10 17:21:44
【问题描述】:

我有一个 long 数组(大小为 4),我想将这 4 个值中的每一个值存储到它自己的单独寄存器中。但我不确定如何做到这一点,因为我从未在汇编中使用过数组。例如,我想将array[0] 存储到r9array[1] 存储到r10 等。有人可以帮我这样做吗?到目前为止,这是我的代码。 lhs 是指向数组的指针。

define(lhs,%rdi)
define(rhs_d,%esi)
define(rhs,%rsi)
define(result,%rdx)

.text


.globl addBignumInt
    .type   addBignumInt, @function
addBignumInt:
.LFB18:
    .cfi_startproc
    # code goes here
    movslq  rhs_d, rhs

    .cfi_endproc
.LFE18:
    .size   addBignumInt, .-addBignumInt

所以,基本上我想做的是 movq lhs[0], %r9 但显然这是不正确的

【问题讨论】:

    标签: arrays assembly x86-64 long-integer


    【解决方案1】:

    你需要将指向数组(它的开头)的指针偏移它所持有的 n 倍 sizeof(type)。

    所以你会做这样的事情:

    mov rax, arrBegin ; rax points to the array of longs
    

    那么以下将在 rbx 中存储第二个元素:

    mov rbx, [rax + 4]
    

    或者,如果您想访问第 n 个元素(可能在循环中,即使您需要手动扩展,如果您总是想更改目标寄存器),那么:

    伪代码(您可以随意执行此操作,使用乘加寻址模式或辅助寄存器):

    mov dest, [rax + n * 4]  
    

    其中 n 是辅助函数或标度{2, 4, 8}(寻址模式的一部分)。

    【讨论】:

    • 所以如果 lhs 是指向数组 arr1 的指针,并且我执行 movq [arr1], rbx 它会将数组 arr1 的第一个值存储到 rbx 中?和movq [arr1 + 4],rax会将第二个值存入rax?
    • 好的,所以如果我想将一个值(例如 8)移回数组中的第二个位置,我会执行 mov [rax + 4], $8 吗?
    • 是的,你会,语法取决于你使用的汇编程序,数组的一般概念是:get(array, Nth) 返回 *(&array + N * sizeof(typeTheArrayHolds))
    • 那么,在您的示例中,arrBegin 是什么?就我而言,这只是 lhs 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多