A. 程序存储器中的数据怎么寻址
程序存储器指令地址使用程序计数器PC指针,PC中存放的是下一条将要从程序存储器中取出的指令的地址。程序计数器PC变化的轨迹决定程序的流程,PC最基本的工作方式是自动加1。
在执行条件转移或无条件转移指令时,将转移的目的地址送入程序计数器,程序流向发生变化。在执行调用指令或响应中断时,将子程序的入口地址或者中断矢量地址送人PC,程序流向发生变化。
DPTR是一个16位特殊功能寄存器,主要功能是作为片外数据存储器或I/0寻址用的地址寄存器,这时会产生RD或wR控制信号,用于单片机对外扩的数据存储器或I/0的控制。数据指针DPTR也可以作为访问程序存储器时的基址寄存器,此时是寻址程序存储器中的表格、常数等单元,而不是寻址指令。
B. MCS-51单片机查表程序
16和7是查表指令时的PC与数据表格之间的字节数
MOV A ,@R0 ;取R0指向的地址中的数据到A
ANL A,#0FH ;高四位清零
ADD A,#16 ;加16
MOVC A, @A+PC ;查表,表的首地址为绝对地址PC+A
MOVC A,@A+PC就需要1个字节啊
查表指令距离表首地址的长度是字节数
用DPTR的汇编程序:
ORG 0100H
MOV 30H,#12H
MOV 31H,#34H
MOV 32H,#56H
MOV 33H,#78H
LCALL SUBRTE
ORG 1000H
SUBRTE: MOV R0,#30H ; ;置地址指针R0初值
MOV R1,#40H ; ;置地址指针R1初值
MOV R2,#4 ; ;置字节数
LOOP: MOV A,@R0 ; ;取16进制数
ANL A,#0FH ; ;屏蔽高4位
MOV DPTR,#TABLE ; ;
MOVC A,@A+DPTR ; ;查表低4位转换为ASCⅡ码
MOV @R1,A ; ;送结果
INC R1 ; ;修改指针
MOV A,@R0 ; ;从新取16进制数
SWAP A ; ;高4位与低4位互换
ANL A,#0FH ; ;取高4位
ADD A,#7
MOVC A,@A+PC ; ;查表高4位转换为ASCⅡ码
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
DEC R1
RET
TABLE: DB '012345678'
DB '9ABCDEF'
END
C. 汇编语言的种寻址方式
所谓寻址方式, 就是寻找操作数地址的方式, 在用汇编语言编程时, 数据的存放、传送、 运算都要通过指令来完成。 编程者必须自始至终都要十分清楚操作数的位置, 以及如何将它们传送到适当的寄存器去参与运算。每一种计算机都具有多种寻址方式。寻址方式的多少是反映指令系统优劣的主要指标之一。
在 MCS -51单片机指令系统中, 有以下 7种寻址方式:
(1) 立即寻址;
(2) 直接寻址;
(3) 寄存器寻址;
(4) 寄存器间接寻址;
(5) 基址寄存器加变址寄存器间接寻址;
(6) 相对寻址;
(7) 位寻址。
1. 立即寻址
立即寻址方式是指操作数包含在指令字节中。 跟在指令操作码后面的数就是参加运算的数, 该操作数称为立即数。 立即数有一字节和二字节两种可能, 例如指令:
MOV A, # 3AH
MOV DPTR, # 0DFFFH
上述两条指令均为立即寻址方式, 第一条指令的功能是将立即数 3AH送累加器A中, 第二条指令的功能是将立即数 0DFFFH送数据指针DPTR中(0DFH→DPH, 0FFH→DPL)。
2. 直接寻址
在指令中直接给出操作数的地址, 这种寻址方式就属于直接寻址方式。在这种方式中, 指令的操作数部分直接是操作数的地址。
在MCS -51 单片机指令系统中, 直接寻址方式中可以访问 3 种存储器空间:
(1) 内部数据存储器的低 128 个字节单元(00H~7FH)。
(2) 特殊功能寄存器。 特殊功能寄存器只能用直接寻址方式进行访问。
(3) 位地址空间。
3. 寄存器寻址
在该寻址方式中, 参加操作的数存放在寄存器里。寄存器包括8个工作寄存器R0~R7, 累加器A, 寄存器B、数据指针DPTR和布尔处理器的位累加器Cy。
4. 寄存器间接寻址
指令中给出间接寻址寄存器,其内容为操作数的地址。寻址内部RAM区的数据时,可使用寄存器R0、R1 (、SP)作为地址指针; 当访问外部RAM时, 可使用R0、 R1及DPTR作为地址指针。寄存器间接寻址符号为“@”
5. 基址寄存器加变址寄存器间接寻址
这种寻址方式用于访问程序存储器中的数据表格, 它以基址寄存器DPTR或PC的内容为基本地址, 加上变址寄存器A的内容作为操作数的地址, 例如: MOVC A, @A+DPTR
MOVC A, @ A+PC
JMP @A+DPTR;散转指令
6. 相对寻址
在MCS -51 指令系统中设有转移指令, 分为直接转移和相对转移指令, 在相对转移指令中采用相对寻址方式。这种寻址方式是以PC的内容为基本地址, 加上指令中给定的偏移量作为转移地址。指令中给出的偏移量是一个 8 位带符号的常数, 可正可负, 其范围为-128~+127。
7. 位寻址
该种寻址方式中, 操作数是内部RAM单元中某一位的信息。
D. 单片机c语言如何查表(将静态的表写在程序存储器中)
c语言中用CODE修饰就是 把大数组存于程序存储中,运行中不能修改,相当于常量
E. oracle用存储过程查询一张表中的信息
Oracle
需要通过
返回一个游标来处理。
SQL>
create
or
replace
package
pkg_HelloWorld
as
2
--
定义ref
cursor类型
3
type
myrctype
is
ref
cursor;
4
--函数申明
5
function
getHelloWorld
return
myrctype;
6
end
pkg_HelloWorld;
7
/
Package
created.
SQL>
CREATE
OR
REPLACE
package
body
pkg_HelloWorld
as
2
function
getHelloWorld
return
myrctype
3
IS
4
return_cursor
myrctype;
5
BEGIN
6
OPEN
return_cursor
FOR
'SELECT
''Hello''
AS
a,
''World''
AS
B
FROM
al';
7
return
return_cursor;
8
END
getHelloWorld;
9
end
pkg_HelloWorld;
10
/
Package
body
created.
SQL>
SELECT
pkg_HelloWorld.getHelloWorld
FROM
al;
GETHELLOWORLD
--------------------
CURSOR
STATEMENT
:
1
CURSOR
STATEMENT
:
1
A
B
----------
----------
Hello
World
上面的是使用动态SQL处理的。
下面是正常SQL处理的。
SQL>
create
or
replace
package
pkg_HelloWorld
as
2
--
定义ref
cursor类型
3
type
myrctype
is
ref
cursor;
4
--函数申明
5
function
getHelloWorld
return
myrctype;
6
end
pkg_HelloWorld;
7
/
程序包已创建。
SQL>
CREATE
OR
REPLACE
package
body
pkg_HelloWorld
as
2
function
getHelloWorld
return
myrctype
3
IS
4
return_cursor
myrctype;
5
BEGIN
6
OPEN
return_cursor
FOR
7
SELECT
'Hello
1'
AS
a,
'World
1'
AS
B
FROM
al
8
UNION
ALL
9
SELECT
'Hello
2'
AS
a,
'World
2'
AS
B
FROM
al;
10
return
return_cursor;
11
END
getHelloWorld;
12
end
pkg_HelloWorld;
13
/
程序包体已创建。
返回游标的函数,不是
“表值函数”
SQL>
SELECT
*
FROM
pkg_HelloWorld.getHelloWorld();
SELECT
*
FROM
pkg_HelloWorld.getHelloWorld()
*
第
1
行出现错误:
ORA-00933:
SQL
命令未正确结束
SQL>
SELECT
pkg_HelloWorld.getHelloWorld()
FROM
al;
PKG_HELLOWORLD.GETHE
--------------------
CURSOR
STATEMENT
:
1
CURSOR
STATEMENT
:
1
A
B
-------
-------
Hello
1
World
1
Hello
2
World
2