两个。
1、东师作业cpu可以访问串行接口中通用寄存器它是中央处理器的重要组成部分,大多数指令都要访问到通用寄存器。通用寄存器的宽度决定计算机内部的数据通路宽度,其端口数目往往可影响内部 *** 作的并行性。
2、东师作业cpu可以访问串行接口中专用寄存器,是为了执行一些特殊 *** 作所需用的寄存器。
寄存器有接口通用寄存器(EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI)、段寄存器(CS、DS、SS、ES、FS、GS)和标志和控制寄存器(EIP、EFLAGS)。
S3C2410有一个多主IIC串行总线,IIC总线上主从设备之间数据通信由SDA和SCL来完成。SDA和SCL信号线是双向的。一般情况下,2410作为主设备,它可以接收从设备上发出的数据或者发送数据给从设备。
段寄存器:
8086/8088CPU可直接寻址1MB的存储器空间,直接寻址需要20位地址码,而所有内部寄存器都是16位的,只能直接寻址6KB,因此采用分段技术来解决。将1MB的存储空间分成若干逻辑段,每段最长64KB,这些逻辑段在整个存储空间中可浮动。
8086/8088CPU内部设置了4个16位段寄存器,它们分别是代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS、附加段寄存器ES、由它们给出相应逻辑段的首地址,称为“段基址”。段基址与段内偏移地址组合形成20位物理地址,段内偏移地址可以存放在寄存器中,也可以存放在存储器中。
回答你这个问题前我需要阐明几个相关概念 比较长 你可能没兴趣看完
不过没有关系,毕竟知识是没有那么容易获得的
OK 回到正题 你是想要显示在寄存器的值
那么 我首先假设:
您的运行环境是有标准输入输出设备(键盘-显示器)的
那么我再假设您的运行环境是在某种OS调度下的,
当然无OS也可以输出你想要的字符,
但是这需要你自己从硬盘MBR自举自己初始化设备自己写设备驱动对硬件IO进行读写
这完全可行,但这确实不切合实际 毕竟有一大堆成熟的OS提供了系统调用接口
也就是API 这样的中间层帮助你 *** 作这些标准输入输出设备显示字符 为何要重新造一堆没啥用的轮子呢
那么好了 到这里 我再假设亲 您的电脑不是MAC 也不是 linux 而是被程序员最为鄙视的windows系统
毕竟这个系统最为广泛,而且易用是吧 大多数人入门PC都是微软的锅不是吗
那么说到这里了 假设了辣么多 麻痹答主还是没有说到底怎么将这些破烂寄存器里的数字变成ASCII字符显示在标准输入输出设备上啊
亲,角多嘛呆 概念如果没有阐明 亲你也是非常糊涂的不是吗
那么再回主题
显然 OS不可能让你直接 *** 作 显存和I/O端口往显示器上丢字 第一,这不安全 系统资源必须由核心代码独占 其二,大多数用户对具体如何 *** 纵显卡往显示器上丢字这种又臭又长的破过程不感兴趣
毕竟你只是想丢几个字到垃圾显示器上嘛 那么就用系统给的API接口不就完了
那么调用系统API接口 那么就需要声明API库 的二进制调用头文件
这个有人帮你做过这事了 无论是masm32 还是radasm 还是masmplus啥的 都集成了微软的MASM库调用 inc 头 你只要找到相应的头文件include一下 然后在 invoke一下 他们提供的函数就行了
当然编译参数里不要忘记加上命令行程序的开关
最后还有一件事,也就是传说中的 二进制整形 如何变成 16进制ASCII 或者 10进制ASCII字串 这个一言难尽 还是写一段 HEX2ASCII 的过程给你看一下吧 你参考一下
或者你不愿写这个 调用 itoa() 或者 wsprintf()这样的函数 自己转换一下也是很简单的事
DATA SEGMENT
A DB 05FH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA;置DS段初值
MOV DS,AX
MOV DL,A
MOV CL,4
SHR DL,CL;右移4位获得高4位
ADD DL,030H;0~9加30H,A~F加37H
CMP DL,'9';将双分支转化为单分支
JBE NEXT1
ADD DL,7
NEXT1:MOV AH,2
INT 21H;显示高位十六进制
MOV DL,A
AND DL,0FH;高4位清0获得低4位
ADD DL,30H
CMP DL,'9'
JBE NEXT2
ADD DL,7
NEXT2:MOV AH,2
INT 21
MOV AH,4CH
INT 21H
CODE ENDS
END START
当然这是16bit 版本 其实改成 32版本也不难 首先要你看得懂
另外PS: 你要保护eax的内容 用 push eax 压栈指令不就完了 要用的时候 pop eax就好了
但是记得堆栈需要后入先出 要不爆栈别怪我
以前我在学习以及使用 51 的时候都是直接控制 51单片机 的寄存器,51的寄存器相对较少,容易记住,位数也比较少, *** 作起来也比较简单,所以51单片机没有固件库的说法。
使用 stm32 单片机有两种方式: 库函数 与 直接 *** 作寄存器 ,这两种方式我们都可以去使用。我接触stm32是有一段时间的,我自己的感觉是库函数是比较适用的,直接 *** 作继续存器我们就得随时得知道寄存器的某一位是干什么的,或者一开始我们不知道就得去看参考手册什么的,个人感觉不是很方便。
库函数 实际上是通过官方给的API函数来 *** 作寄存器,其实归根结底, 就是不管什么单片机或者什么硬件,你 *** 作的都是寄存器,只是 *** 作的方式不一样而已 ,这一点一定要清楚。
stm32是一个芯片,使用的是ARM架构,但是外设都是由芯片公司决定的,使用ARM架构的芯片公司有很多于是ARM公司与芯片公司商议确定了 CMSIS 标准( Cortex Microcontroller Software Interface Standard ) ,翻译过来是 “ARM Cortex™ 微控制器软件接口标准” 。 CMSIS 层在整个系统中是处于中间层,向下负责与内核和各个外设直接打交道,向上提供实时 *** 作系统用户程序调用的函数接口。 CMSIS 简单来说就是强制要求芯片公司编写固件库必须按照这个标准进行,系统初始化函数名字必须是 SystemInit 。
固件库里面有stm32的外设例程,这些都是芯片公司编写而成,建议写程序从固件库里面直接复制修改,所以 我们得很清楚自己想要什么 。
stm32f10x_stdperiph_lib_umchm 这个文件是帮助文档,个人感觉很有用
续、、、、、、
在32位汇编中,对于工作于ring3的应用程序来说,cr0,gdtr等寄存器是不可见的,可用的寄存器有eax,ebx,ecx,edx,esi,edi,esp,ebp等
其中eax-edx还可以以ax进行16位调用,ah,al进行8位调用,
esi,edi主要用于串 *** 作,esp用于存放堆栈栈顶地址,ebp用于存放堆栈基址。
其余寄存器的作用在32位中没有专门的规定(不过api函数的返回值统一存放于eax中)
另外ebx,esi,edi,ebp,esp这几个寄存器的在使用后要由使用者负责恢复调用前的值
以上就是关于东师作业cpu可以访问串行接口中的几个主要寄存器全部的内容,包括:东师作业cpu可以访问串行接口中的几个主要寄存器、寄存器有哪些接口、汇编语言中,怎么单独显示某个寄存器的内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)