tc2.0环境下的C语言研究-简单使用寄存器并打印函数的偏移地址

在c语言中使用变量的目的是:为了编程时存储数据。所以如果有一种方法可以让我们不用变量就可以存储数据,我们就不再需要变量了。

在汇编中存储数据,我们可以利用AX、BX等寄存器和内存空间,在C语言中也是类似的

分别有:_AX、_BX、_CX、_DX、_BP、_SP、_CS、_DS、_SS、_ES等等

这些分别对应了我们在汇编学习到的寄存器。

编写一个url.c的程序
程序如下:
Main()
{
_AX=1;
_BX=1;
_CX=2;
_AX=_BX+_CX;
_AH=_BL+_CL;
_AL=_BH+_CH;
}
为了用debug查看汇编代码,所以必须知道main函数的入口地址,如下程序可以实现打印main函数的偏移地址

Main()
{
Printf(“x%\n”,main);//结果为0x01fa
}
通过u cs:1fa可以得到看到如下汇编代码

-u cs:1fa
0CC3:01FA B80100 MOV AX,0001
0CC3:01FD BB0100 MOV BX,0001
0CC3:0200 B90200 MOV CX,0002
0CC3:0203 8BC3 MOV AX,BX
0CC3:0205 03C1 ADD AX,CX
0CC3:0207 8AE3 MOV AH,BL
0CC3:0209 02E1 ADD AH,CL
0CC3:020B 8AC7 MOV AL,BH
0CC3:020D 02C5 ADD AL,CH
0CC3:020F C3 RET

可以有ret推测:c语言将函数实现为汇编语言中的子程序;经过大量实例可以看出,c语言将函数实现为汇编语言中的子程序的推测是成立的。

进一步推想:C语言将函数实现为汇编语言的子程序,从C语言的层面来看,main函数是一个程序的起始入口点,但实际上,可执行文件即这个.exe程序的入口点并不是main,

是谁调用了main函数呢?是C0S.obj,c0s.obj为程序的执行初始化了环境,比如数据段与代码段的建立等,然后调用main函数执行所需要完成的规定程序动作。

### STM32 UART 寄存器配置用于传输 对于STM32系列微控制器而言,为了实现UART接口的数据发送功能,需要正确配置一系列寄存器。当准备通过UART端口发送单个字节时,应向USART_DR寄存器写入待发数据,在此过程中,TXE位(即发送数据寄存器空标志)会被硬件自动清除至0,表明当前发送缓冲区已占用[^3]。 一旦前次的数据已经从移位寄存器中全部发出并腾出了空间,新的数据将会从TDR被拷贝到移位寄存器内;而假如在此之前UART正处于闲置状况下,则对USART_DR的操作会立即将新数据送入移位寄存器之中启动传送过程,并且此时TXE信号立刻恢复高电平状态以指示可以接受下一个字符输入。最后,当整个消息帧包括停止位在内的所有比特都完成了物理层面上的输出之后,TC位置1用来报告此次完整的发送动作完毕。 下面给出一段基于C语言编写的小程序片段作为示范,它展示了怎样利用直接访问寄存器的方式来进行简单的字符发射: ```c // 定义 USART1 的基地址 #define USART1_BASE (0x40011000UL) // 发射函数定义 void USART_SendChar(char ch){ // 访问 USART1 数据寄存器 DR 地址偏移量为 0x04 *(volatile unsigned int *)(USART1_BASE + 0x04) = (unsigned int)(ch); // 等待直到 TC(Tansmission Complete Flag) 被置位, 表明上一字符已被成功送出 while(!(*(volatile unsigned char *)(USART1_BASE + 0x18) & 0x40)); } ``` 这段代码实现了基本的功能——往指定的UART通道里注入一个ASCII码表里的字母,并监视着该外设内部的状态变化直至确认信息确实离开了芯片为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值