急!!!汇编程序:将以STR1为首地址的字节串传送到以STR2为首址的字节存储...
发布网友
发布时间:2024-10-21 22:32
我来回答
共1个回答
热心网友
时间:2024-11-17 08:38
不同平台的汇编语言差异很大。比如你是不是用Sun sparc的汇编或者MAC的汇编。
现在假定你用X86的汇编,并且假定是32位的。以下是一个示例性代码,我给你加了点注释。这个代码来自于系统的memcpy函数,但是常数定义是需要你自己定的,比如长度length需要先声明(DWORD length之类的)。另外,同样是X86的32位汇编,在不同的汇编器下面的源宿顺序是不同的(例子里面是Linux的顺序(源在前,宿 后),微软的好像是反的),常量表示什么的也不同,需要根据你自己的汇编器修改一下。另外,这个虽然是系统的memcpy实现,但是不是最安全的版本,如果你的STR1和STR2空间有重叠的时候会出现错误,如果两者空间完全不重叠,是没有问题的。
mov length,%ecx ; 将长度保存在ecx寄存器
mov %edi,%eax ; 保存edi到eax (自己的程序不一定必要的,函数是需要的)
mov STR2,%edi ; 将STR2放在edi (目标寄存器)
mov %esi,%edx ; 保存esi到edx
mov STR1,%esi ; 将STR1放到esi
cld ; 清除方向标致,从低地址拷贝到高地址
shr %ecx ; 右移一位长度,相当于除2
jae no_remain_1 ; 检查是否有余数
movsb %ds:(%esi),%es:(%edi) ; 如果有余数,拷贝1个字节的余数部分
no_remain_1:
shr %ecx ; 再右移一位长度,相当于再除2
jae no_remain_2 ; 检查是否有余数
movsw %ds:(%esi),%es:(%edi) ; 如果有余数,再拷贝2个字节的余数部分
no_remain_2:
repz movsl %ds:(%esi),%es:(%edi) ; 现在一定是4的倍数的数据需要拷贝,每次4字节拷贝
mov %eax,%edi ; 恢复eax到edi
mov %edx,%esi ; 恢复edx到esi