【问题标题】:Converting C++ to Assembly Language [closed]将 C++ 转换为汇编语言 [关闭]
【发布时间】:2014-06-07 08:19:16
【问题描述】:

使用块结构的 .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 的在线课程,所以不,你没有为我做作业,我确实很注意。我只是在挣扎。

【问题讨论】:

  • 这是家庭作业吗?你有什么办法解决这个问题?
  • 应该在课堂上集中注意力然后在他们分发这个作业之前...
  • @ElGavilan 这不是为了真正的课堂讲课..
  • 编译并查看程序集..?
  • 由于汇编语言依赖于处理器,你的目标处理器是什么?

标签: c++ assembly


【解决方案1】:

查看您的编译器文档。大多数编译器和 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.

【讨论】:

    【解决方案2】:

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

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

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

    微软参考:

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

    【讨论】: