在汇编x86-64中编写一个简单函数

时间:2018-11-25 20:04:28

标签: assembly x86-64 memory-address

我正在尝试为x86-64汇编语言(称为multInts)编写的实验室编写第一个函数。它将intArray1的第一个元素乘以intArray2的第一个元素,然后乘以第二个,依此类推。函数原型为void multInts(int size, int *array1, int *array2); 这是实验室的.data部分:

.data
sizeIntArrays:
    .long 5
sizeShortArrays:
    .word 4
intArray1:
    .long 10
    .long 25
    .long 33
    .long 48
    .long 52
intArray2:
    .long 20
    .long -37
    .long 42
    .long -61
    .long -10

这是我到目前为止所写的内容:

##### MAIN FUNCTION
.text
.globl main
.type main,@function

main:
pushq %rbp
movq %rsp, %rbp

#pass parameters and call other functions
movl sizeIntArrays, %edi    #move size to registers for 1st parameter
leaq intArray1, %rsi        #load effective address of intArray1 to register rsi
leaq intArray2, %rdx        #load effective address of intArray2 to register rdx
movq $intArray1, %r10
movq $intArray2, %r11
call multInts           #call multInts function


movq $0, %rax           #return 0 to caller

movq %rbp, %rsp
popq %rbp
ret
.size main,.-main


##### MULTINTS
.globl multInts
.type multInts,@function

multInts:
pushq %rbp
movq %rsp, %rbp

#add code here for what the functions should do
movq $0, %r8            #initialize index for array access in caller save reg
movq $0, %rcx           #initialize 8 byte caller save result reg

loop0:
cmpl %r8d, %edi         #compare index to size
je exit0            #exit if equal
imulq (%r10, %r11), %rcx    #multiply elements of both array and store in result  reg
incq %r8            #increment index
jmp loop0

exit0:
movq $.LC0, %rdi
movq %rcx, %rsi
movq $0, %rax

call printf

movq %rbp, %rsp
popq %rbp
ret
.size multInts,.-multInts

所以,我要弄清楚的是如何按照函数原型的要求创建指向intArray1的指针,然后如何在multInts函数中正确调用它?我尝试使用leaq将intArray1&2的地址存储到寄存器中,但是后来我不知道如何访问这些值。另外,我不确定我是否正确使用了imulq函数将两个值相乘。代码尝试执行multInts时,我一直收到分段错误。让我知道是否需要更多信息,谢谢。

1 个答案:

答案 0 :(得分:2)

.long is the same as .int,其大小为4个字节。因此,您不能直接使用imulq处理它(语法错误的事实除外)。您可以使用movsx(Intel语法)或movslq(AT&T语法)将带符号的值加载到x64寄存器中。

我想RCX应该包含乘法的总和。

更改

imulq (%r10, %r11), %rcx    #multiply elements of both array and store in result  reg

movslq (%rsi,%r8,4),%rax    # Load a long into RAX
movslq (%rdx,%r8,4),%r11    # Load a long into R11
imulq %r11, %rax            # RAX *= R11
addq %rax, %rcx             # RCX += RAX

并删除

movq $intArray1, %r10
movq $intArray2, %r11

您不需要它。