本文目录一览:
C语言程序设计实验中汇编程序使用的寻址方式有?
又是汇编的。。。
计算机是通过执行指令(由操作码字段和操作数字段组成)序列来解决问题的,因而每种计算机都有一组指令集(指令系统)供给用户使用,寻址就是其中之一(如为了找到操作数)。
寻址方式:1)与数据有关的寻址方式 :
a 立即寻址方式:操作数(立即数)直接存放在指令中,紧跟在操作码,作为指令的一部分,这中寻址方式用来表示常数,它经常用于给寄存器赋初值,且只能用于源操作数字段,不能用于目的操作字段,且源操作数长度与目的操作数长度一致。
b 寄存器寻址方式:操作数在寄存器中,指令用来指定寄存器号,不需要访问存储器来取得操作数,速度较快。
c 直接寻址方式:操作数的有效地址(在8086里把操作数的偏移地址叫做有效地址)只包含位移量一种成分,其值就存放在代码段中指令的操作码之后,位移量的指即操作数的有效地址。适用于处理单个变量。
d 寄存器间接寻址方式:操作数的有效地址只包含基址寄存器内容或变址寄存器内容一种成分,因此有效地址就在某个寄存器中,而操作数就在存储器中。适用与表格处理,执行完一条指令后,只需修改寄存器的内容就可以取出表格下一项。
e 寄存器相对寻址方式:操作数的有效地址即为基址或变址寄存器和指令中指定的位移量之和。
f 基址变址寻址方式:操作数的有效地址是一个基址寄存器和一个变址寄存器之和。
g 相对基址变址寻址方式 h 比例变址寻址方式 等等。
2)与转移地址有关的寻址方式。
a 段内直接寻址:转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和。
b 段内间接寻址:转向有效地址是一个寄存器或是一个存储单元的内容 。(常用)
c 段间直接寻址 d 段间间接寻址
此外 还介绍一些寄存器 如通用寄存器 AX BX CX DX 也可叫做数据寄存器,可以以字或字节的形式访问, 另外 SP BP SI DI 四个16位寄存器可以像数据寄存器一样在运算时存放操作数,但他们只能以字(16位)为单位使用,此外它们更经常的用途是在存储器寻址时,提供偏移地址,再者有四个专门提供段地址的寄存器,称为段寄存器 有代码段CS 数据段DS 堆栈段SS 附加段ES。
在单片机的C语言程序设计中,如何使用SFR和可寻址位
你好!
在c语言中无法对SFR(特殊寄存器),比如程序状态寄存器(PSW)等寄存器进行操作,也就不能判断它们的标志位了。比如判断Z标志位,C标志位等操作。对于要操作这类寄存器。我们唯一的办法只能用汇编语言。或者在C语言中嵌入汇编语言来解决。所以我们写单片机程序千万不能放弃汇编语言。某些底层的硬件操作只能靠汇编语言来完成。
希望对你有所帮助,望采纳。
单片机C语言怎么声明一个可以位寻址的变量
是这个样子的,你只要声明了位变量,比如bit a;而且这个变量是全局变量,或者是函数内部的静态变量,那么,这个位变量的地上就恒不变了,只是地址是多少这个是编译器随机分配的,不敢十分确定,但是在以后的运行中,地址肯定是不变的。
如果你声明的是函数内部的动态变量,比如在函数内部声明:bit a,那么,这个位变量是随着函数的调用变化的,其地址也是变化的。
所以,你只要声明一个全局的位变量,那么,这个变量就肯定是地址不变的,当然,不知道其地址具体是多少罢了。
如果你非要知道每个地址是多少,那么,有两个办法:
1 你集中把128个位全部都定义出来。
比如,你在某个C文件里,这样写:
bit Bit00 = 0;
bit Bit01 = 0;
bit Bit02 = 0;
bit Bit03 = 0;
一直定义128个,把所有位空间占满,那么,这样,就可以肯定Bit00的地址是0x20的最低位,bit01的地址是0x20的次低位了。
2 用sbit,而不用bit.
比如:unsigned char data B_Var[16] = 0;
sbit Led_Status1 = B_Var[0]^7;那么,就表示Led_Status 是第20H地址中的最高位。
sbit Led_Status2 = B_Var[6]^3;那么,就表示Led_Status 是第26H地址中的第3位。
这个其实并不是定义了位变量,只是起了个别名而已。但效果一样,只是注意,你更改B_Var[6],可能会更改26H的地址第3位,所以,如果你只用位,那么,就不要操作B_Var[6]这个数组元素。
其实呢,你只要定义个全局变量就行了,没有必要知道这个bit变量的地址,因为没有什么实际意义。