0
class MyString{
char buf[100];
int len;

boolean append(MyString str){

int k;
if(this.len + str.len>100){

for(k=0; k<str.len; k++){
  this.buf[this.len] = str.buf[k];
  this.len ++;
}
 return false;
}

return true;

}
}

上述是否转化为:

start:
  push ebp  ; save calling  ebp
  mov ebp, esp  ; setup new ebp
  push esi  ;  
  push ebx  ;  
  mov esi, [ebp + 8]  ;  esi = 'this'
  mov ebx, [ebp + 14]  ;  ebx = str
  mov ecx, 0  ; k=0
  mov edx, [esi + 200] ;  edx = this.len

append:
  cmp edx + [ebx + 200], 100  
  jle ret_true  ; if (this.len + str.len)<= 100 then ret_true
  cmp ecx, edx
  jge ret_false  ; if k >= str.len then ret_false
  mov [esi + edx], [ebx + 2*ecx]  ; this.buf[this.len] = str.buf[k]
  inc edx  ;  this.len++

aux:
  inc ecx  ; k++
  jmp append

ret_true:
  pop ebx  ; restore ebx
  pop esi  ; restore esi
  pop ebp  ; restore ebp
  ret true

ret_false:
  pop ebx  ; restore ebx
  pop esi  ; restore esi
  pop ebp  ; restore ebp
  ret false

我最大的困难是弄清楚要压入堆栈的内容和指针的数学运算。

注意:我不允许使用全局变量,我必须假设 32 位整数、16 位字符和 8 位布尔值。

4

1 回答 1

3

听起来您有一个任务,要创建执行字符串附加操作的 Intel x86 汇编代码。

如果这是真的,那么检查 C 编译器(如英特尔 C 编译器或 Microsoft VC++ Express 编译器)的反汇编输出可能对您有指导意义。编译一些非常简单的 C 代码,然后反汇编并查看结果。

编译器通常做的事情与人类编码员会有所不同,但根据我的经验,不难弄清楚生成的代码中发生了什么。您可以看到 ASM 代码如何管理堆栈、如何完成指针运算、如何以及何时初始化寄存器、使用哪些寄存器以及如何使用等等。

一个简单的 C 例程可能是您自己的 strlen 版本。

然后,增加复杂性或改变事物,再次编译和反汇编,看看会发生什么。就像,而不是 strlen,创建一个返回字符串中最后一个字符的 C 例程。

或者,如果你只是想要答案,你可以试试Codecodex。:)

于 2010-04-29T22:45:16.177 回答