目录
一、题目要求
修改代码,要求将原汇编语言 Init_1函数的类型改为 int Init_1(init) ,此函数功能修改为传入一个整型数x,函数运行后返回整型数 x+100。 请编程实现,并仿真跟踪调试;
如果要求在汇编函数中调用一个 C语言写的函数,应该如何修改汇编代码?
二、c语言中用汇编语言
1.1创建工程
首先还是新建工程:
选择芯片是STM32F103C8
然后跳出一个页面,按下图选择:
然后向工程里添加文件
1.2、创文件
在keil5下编写fun.s和main.c
fun.s
AREA func, CODE, READONLY ;声明代码段func为只可读
EXPORT init ;声明init,以便外部函数调用
init
add r0,r0, #100 ;寄存器r0的值加上100并赋给r0
bx lr ;返回主函数
main.c
#include <stdio.h>
extern int init(int x); //引用外部函数
int main(void)
{
int x=20;
init(x); //调用外部函数
return 0;
}
1.3、调制
然后选择Debug 页面,在“Debug”选项卡中选择“Use Simulator”,表示使用软件仿真;选择“Run to main()”则表示跳过汇编代码,直接跳转到main函数开始仿真。设置下面的“Dialog DLL”项为“DARMSTM.DLL”和“TARMSTM.DLL”;parameter项为“-pSTM32F103C8”,用于设置支持STM32F103C8的软硬件仿真。(当时没发现标记图片的软件,手画的比较寒碜)
最后进入调试
再单步调试到x=20(换成十六进制为14)
这一步是参数刚刚从main函数中传到汇编里面,左边寄存器R0的值变成了十六进制的14,这是我们之前在main函数中定义的变量x的值,从十进制的20变成了十六进制的14。
接着我们继续运行:
这里R0寄存器的值变成了十六进制的78,也就是十进制的100+20=120转化为十六进制
继续执行,则会跳回到main函数中,将寄存器R0中的值返回到主函数中。
三、在汇编语言中用c语言
这个也需要创建工程文件,然后才是后面的添加下面的代码
2.1创文件
init.c
#include <stdio.h>
extern void asm_main(); //引入汇编函数
int init(int x)
{
return x+100;
}
int main()
{
asm_main(); //调用汇编函数
return 0;
}
asm_main.s
AREA asm,CODE,READONLY ;声明代码段asm
IMPORT init ;引入外部函数,即C语言函数init
EXPORT asm_main ;声明,以便调用
asm_main
mov r0, #20 ;使寄存器r0的值等于20
BL init ;调用外部函数,即C语言函数
bx lr ;返回主函数
2.2调制
因为使用R0进行传参,查看R0的值(20的十六进制是14)
然后单步调制(120的十六进制78)
总结:
这次实验它是从寄存器角度为我展示了我们平常一些简单的C程序实现的过程,让我更加了解了c语言和汇编语言的关系。