gpt4 book ai didi

c - 将程序集 'shl' 、 'OR' 、 'AND' 、 'SHR' 操作转换为 C 的引用?

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:47 25 4
gpt4 key购买 nike

我要将以下 AT&T x86 程序集转换为 C:

  movl 8(%ebp), %edx
movl $0, %eax
movl $0, %ecx
jmp .L2
.L1
shll $1, %eax
movl %edx, %ebx
andl $1, %ebx
orl %ebx, %eax
shrl $1, %edx
addl $1, %ecx
.L2
cmpl $32, %ecx
jl .L1
leave

但必须遵守以下框架代码:

int f(unsigned int x) {
int val = 0, i = 0;
while(________) {
val = ________________;
x = ________________;
i++;
}
return val;
}

我可以说这个片段

.L2
cmpl $32, %ecx
jl .L1

可以解释为while(i<32) .我也知道 x存储在 %edx , val%eax , 和 i%ecx .但是,我很难在 while 中转换程序集。/.L1循环到适合提供的框架代码的压缩高级语言中。例如,可以 shll , shrl , orl , 和 andl简单地使用它们的直接 C 等价物( <<>>|& )编写,还是有更多细微差别?

是否有用于汇编到 C 语言转换的标准化指南/“备忘单”?

我知道汇编到高级转换并不总是一目了然,但汇编代码中肯定有一些模式可以一致地解释为某些 C 操作。

最佳答案

For example, can shll, shrl, orl, and andl simply be written using their direct C equivalents (<<,>>,|,&), or is there some more nuance to it?

他们可以。让我们逐步检查循环体:

  shll $1, %eax    // shift left eax by 1, same as "eax<<1" or even "eax*=2"
movl %edx, %ebx
andl $1, %ebx // ebx &= 1
orl %ebx, %eax // eax |= ebx
shrl $1, %edx // shift right edx by 1, same as "edx>>1" = "edx/=2"

让我们去

  %eax *=2
%ebx = %edx
%ebx = %ebx & 1
%eax |= %ebx
%edx /= 2

ABI 告诉我们 (8(%ebp), %edx) %edx 是 x,%eax(返回值)是 val:

  val *=2
%ebx = x // a
%ebx = %ebx & 1 // b
val |= %ebx // c
x /= 2

合并 a,b,c: #2 将 a 插入 b:

  val *=2
%ebx = (x & 1) // b
val |= %ebx // c
x /= 2

合并 a,b,c: #2 将 b 插入 c:

  val *=2
val |= (x & 1)
x /= 2

最后一步:将两个'val ='合并为一个

  val = 2*val | (x & 1)
x /= 2

关于c - 将程序集 'shl' 、 'OR' 、 'AND' 、 'SHR' 操作转换为 C 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48660934/

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