中易网

设计一个汇编语言程序,完成总长度为10个字的数据复制,从源src区复制的到目标dst区,

答案:1  悬赏:40  
解决时间 2021-01-21 13:22
设计一个汇编语言程序,完成总长度为10个字的数据复制,从源src区复制的到目标dst区,
最佳答案

要想实现拷贝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分真是难。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为什么老是有人说要请妹子吃六块钱的麻辣烫,
中海油篮球赛
温州新形象专业烫染地址在什么地方,想过去办
一次性祛斑的方法有哪些
担还可以组什么词
天蝎座女生,喜欢什么颜色?
沈阳微创大脚骨哪里做的好啊?
我想买一个中等价格的人像摄影镜头,哪位老师
怎样才能让自己更积极、主动的做好工作?该有
刚怀孕一个月用什么方法打掉他
2%化成小数点是多少
倾城恋的繁体字怎么写
日产轩逸豪华版1.6排量耗油多少钱公里
喝酒对人体有好处没有?如果有的话,喝多少为
哪位说说蹲便器冲不干净怎么办
推荐资讯
要死要死的也很多好哒好哒回答
武汉房产过户手续要办理哪些?离婚后房产按揭
休克尔规则中的π指的是什么
上海尿酸高去哪里看好
我是重庆的,问一下重庆茶园廉租房怎么申请?
在苹果笔记本电脑上可以安装WPS,EXCEL这种软
天津氯磺化面漆哪家公司的比较好?有何推荐?
兰花叶子发黄怎么办?有没有谁懂日常养护的一
大桥长约3037米,它的模型长度是多少?500比1
在武汉买的新车能上长沙的牌照吗?
梳子是在什么时候发明的?
十堰安捷货运部(竹山提货处)地址好找么,我有
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?