gpt4 book ai didi

c - 循环组件 x86

转载 作者:太空宇宙 更新时间:2023-11-04 07:13:21 24 4
gpt4 key购买 nike

我是 Assembly(x86 ATT 语法)的初学者。我正在做一项作业,我必须遍历二维数组的每个索引并找到 1 的数量。该方法接受 2d int 数组,int w,int h。我如何实现循环以从 0 到 w 并使用循环指令反弹。我知道如何使用 jmp 指令执行此操作,但循环只会给我错误/segFaults。这是我对跳转语句的尝试,它有效。我将如何使用循环指令转换内部循环?

pushl   %ebp
movl %esp, %ebp

movl $0, -4(%ebp)
movl $0, -8(%ebp)
movl $0, -12(%ebp)
movl $0, -4(%ebp) #outside loop
jmp .L10

.L14: #Inner Loop
movl $0, -8(%ebp)
jmp .L11

.L13:
movl -4(%ebp), %eax
leal 0(,%eax,4), %edx
movl 8(%ebp), %eax
addl %edx, %eax
movl (%eax), %eax
movl -8(%ebp), %edx
sall $2, %edx
addl %edx, %eax
movl (%eax), %eax
cmpl $1, %eax
jne .L12
addl $1, -12(%ebp)

.L12:
addl $1, -8(%ebp)
.L11: #check inner loop
movl -8(%ebp), %eax
cmpl 12(%ebp), %eax
jl .L13
addl $1, -4(%ebp)

.L10: #check outside loop
movl -4(%ebp), %eax
cmpl 16(%ebp), %eax
jl .L14
movl -12(%ebp), %eax

leave
ret

最佳答案

通常使用 loop 除了代码更小之外没有任何优势。它通常速度较慢且灵 active 较差,因此不推荐。

也就是说,如果您仍想使用它,您应该知道它使用 ecx 寄存器进行倒数到零。因此,您需要重组代码以适应这种情况。在您的情况下,这意味着用 w 的值加载 ecx 并让它倒计时。您还需要在索引期间应用 -1 的偏移量,因为您当前的循环变量从 0w-1,但是 ecx 将从 w 下降到 1(含)。

此外,在循环体之后使用了loop指令,即实现了一个do-while循环。要在计数为零时跳过循环体,可以使用伴随指令 JECXZ

关于c - 循环组件 x86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26694319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com