我试图解决这个问题几天 . 我不知道如何分配内存来将字符串复制到另一个位置 . 这是代码:
caesarAsm proc string: DWORD, key: DWORD, stringLength : DWORD
; inside this procedure I have a code that ciphers string value using caesar cipher
mov eax, string
ret
caesarAsm endp
然后在我使用该功能的CPP文件中:
caesar1(word, 13, strlen(word))
它改变了通过引用传递的单词的值 . 我希望它能做什么,直到我做:
word = caesar1(word, 13, strlen(word))
我一直试图解决这个问题在互联网上搜索,但我没有发现任何有用的东西 . 我想这个解决方案很简单,但我找不到它 . 我试图用ESI和EDI寄存器做某事 . 我想我必须分配新的内存然后将字符串复制到这个分配的位置 . 怎么做?
1 回答
根据注释中的讨论,复制字符串的基本方法是在.bss中声明一个标签,并保留保存字符串副本所需的字节数 . 这是使用intel语法,因为我没有MASM可用 . 例如,您可以在.data中声明原始字符串 . 例如 . :
对于副本,将
str_str1
的地址加载到esi
中,并将str_str2
的地址加载到edi
中 . 在cx
中加载要复制的字符数,然后调用rep movsb
将cx
中指定的字节数从esi
移动到edi
. 例如 . :这会将
str_str
复制到str_str2
. 然后你可以添加代码来打印它们等.Nasm提供了一种简单的宏语言来帮助重复执行任务,如读取调用和写入调用(特别是对于缩进,间距,打印等) . nasm语法中的完整示例是:Nasm compile/link
Output
查看MASM语法差异并进行必要的更改 . 应该没有理由你不能完成同样的事情 .
Determining String Size - 32-bit
如上所述,为了确定未知字符串的长度,字符串本身必须以空值终止,以提供要测试的结束标记字符 . 字符串地址放在
edi
中,然后您有效地检查每个字符是否为零(数字零,而不是字符零),长度由到达空终止字符所需的迭代次数确定:当然,您不必将其用作函数,您可以将代码放在汇编程序的主体中,但由于它是您经常使用的东西,因此将其用作函数会有所帮助 .