在循环 x86-64 程序集之前和内部使用 printf

2023-12-13

我无法弄清楚如何在此函数中正确使用 printf 。因此该函数称为 multInts,应该将第一个数组的第一个元素与第二个数组的第一个元素相乘,然后继续遍历整个数组。但是,实验说明指定我不能在主函数中调用 printf 。因此,我需要打印出“Products:\n”一词,然后在之后的每个新行中打印出产品。但是,我不知道如何在循环中使用 printf 。讲师说我们应该“在计算乘积后在循环中调用 printf”,并且“在调用 printf 之前保存和恢复调用者保存寄存器”,但我不确定这意味着什么。 到目前为止,我的代码如下所示:

.file   "lab4.s"
.section .rodata

.LC0:
    .string "Products: \n"
.LC1: 
    .string "%i \n"
.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
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
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
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

我尝试做的只是将 printf 指令移到循环之前,但是在尝试运行循环时它给了我一个分段错误,因为 %rdi 和 %rsi 包含需要在循环中使用的数组的地址环形。我该如何解决这个问题以及我应该使用哪些寄存器?另外,如何在循环内调用 printf ?

输出应如下所示:

Products:
200
-925
1386
-2928
-520

假使,假设printf破坏所有被调用破坏的寄存器(通过 linux x86-64 函数调用保留哪些寄存器),并对需要从循环的一次迭代到下一次迭代生存的任何内容使用不同的。

查看编译器输出的示例:用 C 编写循环版本并使用以下命令进行编译-Og.

显然,您需要移动在寄存器中设置参数的指令 (如格式字符串)以及call printf.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在循环 x86-64 程序集之前和内部使用 printf 的相关文章

  • Rails 从哈希数组中选择最大值

    我有一个像这样的哈希数组 我想取其中的最大值 data name abc value 10 0 name def value 15 0 name ghi value 20 0 name jkl value 50 0 name mno val
  • 计算排列中“反转”的数量

    设 A 为一个大小的数组N 我们称之为几个索引 i j 一个 逆 如果i lt j and A i gt A j 我需要找到一种接收大小数组的算法N 具有唯一的数字 并返回时间的倒数数O n log n 您可以使用归并排序 http en
  • 从 GP regs 加载 xmm

    假设您的价值观是rax and rdx你想加载到xmm登记 一种方法是 movq xmm0 rax pinsrq xmm0 rdx 1 虽然速度相当慢 有没有更好的办法 在最近的 Intel 或 AMD 上 你不会在延迟或 uop 计数方面
  • Processing.js 的图片数组无法正确显示

    我正在尝试从数据库中获取图片路径数据并将其显示在处理草图中 如下所示 这是 Javascript 文件
  • 在Numpy数组中如何找到一个值的所有坐标

    如果我想找到所有 3D 数组中最大值的坐标 如何找到它们 到目前为止 这是我的代码 但它不起作用 我不明白为什么 s set elements np isnan table numbers table elements biggest fl
  • 如何在 MacOS 上的 MARS 中打开保存的 .asm 文件

    我是 MIPS 的新手 我找不到如何打开我保存的文件 我在下载文件夹下保存了 asm 文件 但是当我尝试在 MARS 中打开文件并导航到同一下载文件夹时 asm 文件不会出现 我在 MacOS 上使用 MARS 如上所述 您需要在 macO
  • 汇编器堆栈对齐(或使用 PUSH 更好的未对齐示例)

    首先我了解 或者我认为我了解 堆栈未对齐的问题 但我知道 就像定义一样 将 16 位值推入 32 位宽的堆栈可能会导致堆栈未对齐 但我不明白的是 这是怎么发生的 因为PUSH and POP检查段描述符处的 D 标志 1 递增 递减 32
  • 将值插入php多维数组

    如何在 php 中将值插入多维数组 我需要使用 while 循环向数组添加越来越多的行 这是我的代码 size 10 p 0 while p lt size myarray array array number gt data p data
  • 如何理解javascript React中的这段代码

    我在网上找到了这个函数在js中的实现 这个函数递归地过滤一个对象数组 每个对象可能有属性 children 它是对象数组 并且对象也可能有孩子等等 该函数工作正常 但我有点不明白 这是我的功能 getFilteredArray array
  • 修改字符数组,修改部分向后显示

    我刚刚开始学习汇编 我正在尝试修改字符数组 这是我的汇编代码 data data byte Five 0 code Asm proc lea rax data mov dword ptr rax Four ret Asm endp end
  • 为什么这个 IA32 汇编代码有 3 个 leaal 指令?

    我编译了这个C函数 int calc int x int y int z return x 3 y 19 z 我在 calc s 中得到了这个 我正在注释正在发生的事情 file calc c text globl calc type ca
  • 32 位 x86 汇编中堆栈对齐的职责

    我试图清楚地了解谁 调用者或被调用者 负责堆栈对齐 64 位汇编的情况相当清楚 它是由caller 请参阅系统 V AMD64 ABI 第 3 2 2 节栈帧 输入参数区域的末尾应按 16 对齐 32 如果 m256 在堆栈 字节边界上传递
  • 将 32 位值加载到 Arm 汇编中的寄存器中

    我想使用arm汇编将1个32位十六进制直接加载到寄存器中 mov r1 0x6c617669 这不能使用 因为从该指令我们只能加载 8 位值 所以我直接从内存加载32位值 那么如何将32位值存储在内存中并使用arm汇编将其直接加载到寄存器中
  • 将 jQuery 数组字符串转换为 PHP 数组

    首先 我得说我对 PHP 还很陌生 我正在尝试获取一个可以使用 foreach 的 PHP 对象 以下字符串通过 ajax 传递 我正在尝试转动以下字符串 menu title TEST1 href title TEST2 href QWE
  • 如何将具有对象数据类型的 Numpy 2D 数组转换为常规的浮点数 2D 数组

    作为我正在开发的更广泛程序的一部分 我最终得到了包含字符串 3D 坐标等的对象数组 所有这些都混合在一起 我知道与结构化数组相比 对象数组可能不是很受欢迎 但我希望在不更改大量代码的情况下解决这个问题 假设我的数组 obj array 有
  • 将 SQL 中的数据存储在数组中

    我正在尝试将 sql 数据库中的数据存储到数组中 目前我有这个 query mysql query SELECT FROM InspEmail WHERE Company LIKE company while row mysql fetch
  • 在 C 中创建 int 数组的数组?

    假设我有以下方法原型 void mix audio int vocal data array int instrumental data array int mixed audio array FOURTH ARGUMENT 我会怎样 在上
  • 将多个数组合并为一个数组

    如何将多个数组合并为一个二维数组 鉴于我有以下输入 var arr1 1 2 3 var arr2 a b c var arr3 aa bb cc 我需要这样的输出 1 a aa 2 b bb 1 c cc 我认为你想要的是将三个数组组合成
  • 如何在Java中打印保留2位小数的浮点数?

    我可以用System out print 您可以使用printf http java sun com j2se 1 5 0 docs api java io PrintStream html printf 28java lang Strin
  • 包含字符串和数字的数组

    在 Objective C 中 很容易创建一个异构数组 如下所示 NSArray myArray String1 String2 123 456 有什么方法可以快速创建这样的数组吗 如果是的话怎么办 Note 我在 swift 中尝试了类似

随机推荐