设计一个汇编语言程序,完成总长度为10个字的数据复制,从源src区复制的到目标dst区,
答案:1 悬赏:40
解决时间 2021-01-21 13:22
- 提问者网友:姑娘长的好罪过
- 2021-01-20 20:42
设计一个汇编语言程序,完成总长度为10个字的数据复制,从源src区复制的到目标dst区,
最佳答案
- 二级知识专家网友:患得患失的劫
- 2021-01-20 21:22
要想实现拷贝10个字节数据,要先弄出流程图。然后通过arm汇编进行
翻译,C代码如下(流程):
void copy_data(int32_t* dst, int32_t* src, int32_t len)
{
int i = 0;
int t = 0;
t = len & ~0x03;
for(i = 0; i < t; i++){
dst[i] = src[i];
}
for(i < len; i++){
*((char*)dst + i) = *((char*)src + i);
}
}
根据ATPCS规则(汇编和C语言函数调用规则)
R0-R3可记做A1-A4 (argument)
R4-R11可记做V1-V8 (variable)
R12可以记IP
汇编实现的copy_data可以给C语言调用(因为满足ATPCS规范)
copy_data:
stmfd sp!, {v1-v8} @ 保存R4-R11(保护现场)
mov v1, #0 @ i = 0
mov v2, a3 @ v2 = len
bic v2, #4 @ v2 = len & ~(0x03)
1: @ loop1:
cmp v1, v2 @ if(i < len & ~0x04){
ldrlo v3, [a2 + v1] @ v3 = src[i];
stmialo a1!,{v3} @ *dst++ = tmp <-dst+4
addlo v1, v1, #4 @ i += 4
blo 1b @ goto loop1
@ }
2: @ loop2:
cmp v1, a3 @ if(i < len){
ldrblo v3, [a2+v1] @ v3 = *((char*)src + i)
strblo v3, [a1], #1 @ *dst++ = t <-dst+1
add v1, v1, #1 @ i++;
blo 2b @ goto loop2
@ }
ldmfd sp!, {v1-v8} @ 恢复现场
mov pc, lr @ return
ARM汇编我也基本忘的差不多了。我是通过查汇编指令然后翻译出来的代码。虽然我
没有经过验证,但是思路就和上面的类似,在汇编中就是通过if(xxx
追问:能麻烦你解释下汇编语言编程的思路嘛? 叨扰了
追答:我的注释那么详细,右边又有对应的C代码。这个题目本来可以简化,实际上寄存器是不是可以随便用,你没讲清楚,是否要遵循ATPCS(汇编/C混调规范)没说,才会弄的程序有点复杂。
这个copy_data函数是根据ATPCS规则编写的。所谓的ATPCS就是汇编语言和C语言共同约定寄存器怎么使用(例如r0~r3用于函数传参,函数返回时通过r0返回数值)。
在ATPCS规则下, r0-r3寄存器可以用a1-a4符号表示(a表示arguement,参数的意思)。剩下的r4-r11可以随便使用,记为v1-v8(v表示variable)。在函数进行处理前,通过 stmfd sp!, {v1-v8}将R4-R8的寄存器值压栈,寄存器都是依据谁使用谁保护原则,不然的话寄存器的原有内容就会被破坏。
随后执行语句: bic v2, #4@ v2 = len & ~(0x03)=》 我写错,实际是 bic v2, #0x03才对。
它的作用是将长度的低2位清零,为什么呢?数据都是按4字节拷贝的,因此拷贝到长度是4的倍数(低两位表示0~3,00 01 10 11),为啥去掉低2位呢?如果我要拷贝9个字节,实际上就是拷贝2次4字节(2*4),然后拷贝最后一个字节。因此我们是先按4字节对齐的方式拷贝数据(按字进行),然后拷贝剩余的数据(按字节进行)
第一个loop 比较v1(最开始v1=0)和v2的大小(拷贝长度去掉低2位),通过stmia每次拷贝4个字节的数据,然后v1+=4,只要v1 < 长度(去掉低2位)就一直拷贝,即blo 1b =》 表示 v1 < v2 调到标号1中执行,1b表示向后跳(below),看代码时从上往下看的,所以下是前方(1f),而上是后方(1b)。1b表示向后跳。
第2个循环,则将长度的低2位置数据取出来,这时可知剩余的字节数(0-3),通过ldrb命令每次从内存中读取一个字节的数据,然后通过strb写入到特定位置。
对于你的提问,你要求写的是程序。我怕你不懂我的思路,我特地先给C语言的代码然后将C语言手工翻译成汇编代码。在汇编代码里还有对应的C代码注释。你不应该看不懂。赚个10分真是难。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯