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