首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86-64汇编到C

x86-64汇编到C
EN

Stack Overflow用户
提问于 2018-01-16 03:43:58
回答 1查看 606关注 0票数 0

我试着把它翻译成C语言,但是我卡在内存地址(%rdi)的移位上了:

代码语言:javascript
复制
program:
  movq  (%rdi), %rax
  testq %rax, %rax
  je L1
  addq  $8, %rdi
  movq  %rax, %rdx
L3:
  cmpq  %rdx, %rax
  cmovl %rdx, %rax
  addq  $8, %rdi
  movq  -8(%rdi), %rdx
  testq %rdx, %rdx
  jne L3
L1:
  ret

到目前为止,我想出了以下几点:

代码语言:javascript
复制
int func(int *x){
    int ret = *x;
    if(ret != 0){
        x+=8; //is this true?
        y = ret;
        while(y!=0){
            if(ret<y){
                ret = y;
            }
            y=?? //What should this say?
        }
    }
    return ret;

可能的解决方案(等待某人确认):

代码语言:javascript
复制
int func(int *x){
  int ret = *x;
  if(ret!=0){
    ++x;
    int y = ret;
    while(y != 0){
      if(ret < y){
        ret = y;
      }
      ++x;
      y = x[-1];
    }
  }
  return ret;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-16 03:50:35

代码语言:javascript
复制
   x+=8; //is this true?

不是的。xint *,在您当前的目标平台上,int是64位宽,即8字节。在汇编中,你有指向字节的原始指针,因为内存可以按字节寻址,所以add rdi,8在C语言中类似于x = (int*)(((int8_t*)x)+8);,可以缩写为++x;

如果movq (%rdi), %rdxrdx = x[0]; // or " = *x;",则movq -8(%rdi), %rdxrdx = x[-1];

剩下的C部分看起来还没有完成。

警告,剧透紧随其后!

它将在x数组中搜索,直到找到零值(终止符),并不断更新找到最小值的ret

看起来我的剧透是错的,比较可能是另一种方式。为了确保这一点,在调试器中运行原始asm和你的C,看看它们是否做同样的事情。此外,观察调试器中的汇编单步执行指令,检查寄存器中的值是如何演变的,通常比任何冗长的讨论更具描述性和可视性。:)很抱歉我不确定,AT&T的语法快把我逼疯了。

顺便说一句,我的"C“翻译可能是这样的(假设asm在数组中搜索"max”值,而不是"min“(我仍然只有90%的把握)):

代码语言:javascript
复制
int64_t func(int64_t *x) {
    if (0 == *x) return 0;
    int64_t ret = *x;
    do {
        if (ret < *x) ret = *x;
        ++x;
    } while (0 != *x);
    return ret;
}

translated by gcc v7.2为(我必须将int更改为int64_t才能拥有64b的int):

代码语言:javascript
复制
func(long*):
  movq (%rdi), %rax
  testq %rax, %rax
  je .L1
  movq %rax, %rdx
.L3:
  cmpq %rdx, %rax
  cmovl %rdx, %rax
  addq $8, %rdi
  movq (%rdi), %rdx
  testq %rdx, %rdx
  jne .L3
.L1:
  rep ret

这与原始组件几乎完全相同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48269670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档