目录
一:在c语言中调用汇编语言
代码写入
创建新工程:
建立新工程后,添加一项新项目(New item)。点击第一项C File(.c),因为是写main函数(main.c)。
勾选如下:
在新创建的main.c函数中写入如下程序:
再添加一项新项目,不过这次选择Asm File(.s)项,因为写Func.s函数,写入汇编语言
在Func.s函数中写入如下汇编语言:
AREA My_Function,CODE,READONLY
EXPORT Init_1
Init_1
MOV R1,#0 ;设R1寄存器是i
MOV R2,#0 ;设R2寄存器是j
LOOP ;写在最左边的是程序名的段名,执行跳转程序时要用到
CMP R1,#10 ;比较R1和10的大小
BHS LOOP_END ;如果R1大于或等于10.则跳转到LOOP_END程序段
ADD R2,#1 ;j++
ADD R1,#1 ;i++
B LOOP ;执行一次循环后,无条件再次进入循环判断,即是跳转到LOOP段
LOOP_END
NOP
END
汇编程序如下,观测程序,程序结束时R1和R2的值应是十进制的10。
然后点击左上角构建,正常情况下应如下图所示
然后点击魔法棒,为了之后的调试再修改几项设置。
将“Create HEX File”一项打勾:
将“Use Simulator”一项打勾,并且修改Diglog DLL和Parameter如下图所示:
调试
然后点击调试按钮,进入调试页面:
观测左侧寄存器,R1和R2的初始状态都是0;
然后点击单步运行,一边点击一边观察。
发现,R1和R2的最终值固定在十六进制的A,相当于十进制的10。与预先估计值相同。
二:修改参考代码功能
现在加一点难度,修改参考代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为 传入一个整型数x,函数运行后返回整型数 x+100。 请编程实现,并仿真跟踪调试;
代码写入
修改汇编语言,将之前的循环删除,只写将整型数加100的语句:
汇编程序Func.s代码如下:
修改main.c函数,因为和刚才比增加了调用函数操作,所以将调用函数的参数加上。并且加上输出返回值的语句。
c语言函数main.c如下:
从程序中可以看到,在主函数中的实参为10,即调用的函数的初始值为10,然后经过Func.s函数的处理,处理值应该是110。则在调试中,R0寄存器的初始值应是十六进制的A,终值应是十六进制的6E。
编译构建如下:
调试
进入调试页面:
单击单步调试,在单击一次后可以看到,R0的初始值变成了A。
单击第二次后,可以看到,R0的终值变成了6E。
符合预期估计。
三:在汇编程序中调用c程序
写入程序
修改main.c函数如下:
修改Func.s函数如下:
编译构建结果:
调试
进入调试页面:
单击单步运行按钮并观察,R0寄存器的值保持为十六进制的5,R1和R2寄存器的值稳定上升,达到十六进制的A后不再上升。满足程序代码。
总结
本篇博客内容较简单,过程比较清晰,要是不懂一些更基础的操作,请移步
https://blog.youkuaiyun.com/afadgfansfa/article/details/120535658?spm=1001.2014.3001.5502