assembly 循环字符序列并在汇编中交换它们

xsuvu9jc  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(106)

我在学校的作业是循环遍历字符串中的一系列字符,并交换它们,使最终结果与原始字符串相反。
我写了3个汇编函数和一个cpp函数,但是在下面的函数上,当我试图运行程序时,我得到了一些错误,我不知道如何修复它。我将在下面的cpp代码和汇编代码中指出错误,如果有人能指出我的错误,我将非常感激!
我的c++代码如下

#include<iostream>
#include <string>

using namespace std;
extern"C"
char reverse(char*, int);

int main()
{
  char str[64] = {NULL};
  int lenght;

  cout << " Please Enter the text you want to reverse:";
  cin >> str;
  lenght = strlen(str);

  reverse(str, lenght);

  cout << " the reversed of the input is: " << str << endl;

  }

下面是我的汇编代码

.model flat

.code

_reverse PROC    ;named _test because C automatically prepends an underscode, it is needed to interoperate

     push ebp     
  mov ebp,esp  ;stack pointer to ebp

  mov ebx,[ebp+8]       ; address of first array element
  mov ecx,[ebp+12]  ; the number of elemets in array
  mov eax,ebx   
  mov ebp,0         ;move 0 to base pointer 
  mov edx,0     ; set data register to 0
  mov edi,0

Setup:

  mov esi , ecx
  shr ecx,1
  add ecx,edx
  dec esi

reverse:

  cmp ebp , ecx
  je allDone

  mov edx, eax
  add eax , edi
  add edx , esi

LoopMe:
  mov bl, [edx]
  mov bh, [eax]

  mov [edx],bh
  mov [eax],bl

  inc edi
  dec esi

  cmp edi, esi
  je allDone

  inc ebp
  jmp reverse

allDone:
  pop ebp               ; pop ebp out of stack 
  ret                   ; retunr the value of eax
 _reverse ENDP

END

在接近开头的一行(显示为push ebp)上,我收到一个错误消息:
无效指令操作数
最后它显示pop ebp,我得到一个错误,它显示了同样的内容。
不确定这是否很大,但我也得到了一个语法错误的第一行代码读取.model flat

nxowjjhe

nxowjjhe1#

根据重现的症状,我将问题诊断为:这是一个32位x86程序集(很明显),但它被视为x64程序集,这不起作用。

  • .model指令对于x64无效,因此存在语法错误。
  • 推入和弹出32位寄存器在x64中是不可编码的,因此存在无效操作数错误。

如果这是在Visual Studio的项目中,请将整个方案或这个个别项目的“平台”设定为x86/win32(它在不同的地方有不同的名称,但请将它设定为32比特)。

相关问题