【发布时间】:2016-11-06 18:27:58
【问题描述】:
我的任务是在汇编中实现一个函数,该函数将执行以下操作: 循环遍历一系列字符并交换它们,以使最终结果是反向的原始字符串(100 分) 提示:从用户那里收集字符串作为 C 字符串,然后将其与用户输入的字符数一起传递给汇编函数。要找出字符数,请使用 strlen() 函数。
我已经编写了 c++ 和汇编程序,并且在范围内工作正常:例如,如果我输入 12345,则输出正确显示为 54321,但如果输入超过 5 个字符:输出开始不正确:对于例如,如果我输入 123456,则输出为:653241。我将非常感谢任何能指出我的错误所在的人:
.code
_reverse PROC
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
Swap:
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
这是我的 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;
}
【问题讨论】:
-
还没有注意到任何实际错误,只是非常奇怪的东西。如果您打算将 EBP 用作通用寄存器,则应省略
mov ebp,esp的内容。 (并且只需使用 ESP 的偏移量访问您的参数)。set data register to 0之类的评论毫无用处。有用的是描述您的函数使用 EDX 的用途。函数顶部的mov eax,ebx似乎没用,为什么不首先加载到 EAX 中呢?您在函数的其余部分中唯一使用 EBX 是将字节放入 BL 和 BH。 -
一个错误是您应该像执行 EBP 一样保存/恢复 EBX,因为它在所有常见的 32 位调用约定中都保留了调用。您可能在某处有另一个错误,因为踩到调用者的 EBX 值可能不会导致您看到的行为。您应该在调试器中单步执行您的代码,看看它做了什么。
-
非常感谢 Cordes 先生的出色和建设性的 cmets 我很抱歉我上传了如此糟糕的代码,根本没有评论,我对我的代码感到非常沮丧,我忘了在我愚蠢的 cmets。
-
代码的第一部分是我们的教练给我们的,所以我什至没有看里面发生了什么,我用 EAX 替换了 EBX,正如你告诉我的那样,它运行良好。修复了 cmets。保存并恢复 EBX。自从我在大学的第二个学期以来,我从来没有被告知过任何关于单步调试的事情。我做到了,并弄清楚我的错误在哪里。
标签: c++ loops assembly reverse masm