将C ++转换为汇编语言

时间:2014-04-22 19:21:04

标签: c++ assembly

使用块结构的.IF和.WHILE指令,以汇编语言实现以下C ++代码。假设所有变量都是32位有符号整数:

int array[] = {10,60,20,33,72,89,45,65,72,18}; 
int sample = 50;

int ArraySize = sizeof array / sizeof sample; 
int index = 0; int sum = 0; 
while( index < ArraySize ) 
{ 
  if( array[index] <= sample ) 
  { 
    sum += array[index]; 
  } 
  index++;
} 

我不知道该怎么做。

这就是我所知道的。

.WHILE index<ArraySize

.IF array(NO CLUE HOW TO DO INDEX ON ASEMBLY) <= sample
sum +=array(AGAIN NO IDEA)
.ENDIF
inc index
.ENDW

我真的在尝试我很困惑。此外,这是Coursera的在线课程,所以不,你不做我的功课,我确实注意了。我只是苦苦挣扎。

2 个答案:

答案 0 :(得分:2)

查找编译器文档。大多数编译器和IDE都可以生成汇编语言文件,列出或以汇编语言显示代码。

某些编译器可能会生成一个列表文件,其中汇编语言与C ++语言语句交织在一起。

编辑1:手动装配语言

索引数组
索引数组是高度特定于平台的,或者我会说不同的处理器有不同的优化方法来访问数组元素。

在ARM7处理器中,数组的地址加载到寄存器中,并将偏移量加载到另一个寄存器中:

LDR R0, #Array  ; Load R0 with the address of the array.
MOV R1, #3      ; Load R1 with the offset, in this case, the 4th element.
LDR R2, R0[R1]  ; Load R2 with the value of Array[3].

这假设您有一个32位值的数组。

另一种方法是将偏移量添加到数组寄存器中。请记住,偏移值必须以字节为单位。所以C ++等价物是*(Array + 3 * sizeof(int))

  LDR R0, #Array;
  MOV R1, #3
  MUL R1, R1, 4; Multiply by size of an int (4 bytes)
  ADD R0, R0, R1; Add R0 to R1 and place sum in R0.
  LDR R2, [R0]; Load value from address in R0.

答案 1 :(得分:0)

我假设.if .else .elseif .endif引用masm 6.11或更高版本(实际上是ml.exe)用于X86的指令。我还假设它是32位模式,因为正在使用32位值。

.if指令需要与比较指令相同类型的操作数,因此其中一个操作数需要是一个寄存器而另一个操作数需要是内存引用,立即值或寄存器,如下所示:

        .if     eax <= array[ebx]
        ; ...
        .else
        ; ...
        .endif

Microsoft参考:

http://msdn.microsoft.com/en-us/library/f4x287ff.aspx