累加器a與
acc區別
累加器寫成a
或acc在51
組合語言指令中是有區別的。
acc在彙編後的機器碼必有乙個位元組的運算元,是累加器的位元組位址
e0h,
a在彙編後則隱含在指令操作碼中。
所以在指令中a
不能用acc
來替代,而對
a的特殊功能暫存器
直接定址
和累加器某一
位的定址
要用acc
,而不能寫成a。
例如,指令inc a
的機器碼是
04h,屬於
暫存器定址
,寫成acc後則成了
inc direct
的格式,對應機器碼為05e0h。a和
acc都表示累加器,但
a是累加器的代號,在指令中預設是無位址的,而
acc是累加器在中的直接位址
(oeh)
,可出現在用直接定址的任何地方,例如:
push acc
pop acc
類似:工作暫存器r0~r7
在指令中也有兩種不同的寫法,生成的機器碼也不同,如:
mov 40h,
r0 ,
mov 40h,
00h假設當前工作暫存器為0
組,前者屬於暫存器定址,後者屬於儲存器直接定址。但r0和
00h的級別不同,
00h只是
ram區的乙個普通單元,其讀寫速度要比慢得多。微型計算機內部通常設定工作暫存器組,運算的結果可以放在暫存器中而不必每次都放到儲存器裡,可以提高機器的工作速度。其實暫存器也是一種儲存器,只不過它是
cpu中的部件,速度最快而已。
暫存器和一般的儲存器是混疊的,同一單元用不同的指令,它就會執行不同的功能。
一般的說法:a
表示了累加器中的內容【暫存器定址】
;acc表示了累加器的位址【直接定址】。
a和acc
的實質是一樣的,對應位址都是
0e0h
,只是彙編在使用時,在格式上取了兩個名字。使用有一定的規律:
當其要進行位表示時,必須用acc
,比如要寫成
acc.7
,而不能寫成a.7
;但當其作為8
位二進位制數時,
acc和
a都能用,但還是有區別:比如
inc acc
和inc a
都能用,還有
push acc,
pop acc
不可以寫成
push a和
pop a
在keil c
中用了這樣乙個命令:
push
a ,彙編時提示錯誤,後來我把
push
a 改為
push
acc 就可以通過了,請問這是什麼回事?a與
acc是同乙個暫存器嗎?
所謂「a」
是相關指令對累加器
a的預設指定(不佔運算元指令),
而push
和pop
沒有預設指定累加器,要訪問累加器就必須採用其所允許的直接定址方式,
「acc」
就是累加器
a的位址。
push
是直接定址,後面一定跟的是直接位址。你可以看到reg51.h
中acc
的直接位址是
0xe0
;也可以
push
e0h;累加器有a、
acc和
e0h三種表示形式,分屬兩種不同的定址方法,使用
a時,為暫存器定址,指令碼為
04h,使用
acc和
e0h時,為直接定址,指令碼為
05e0h。可a
的位7,為什麼非得用
acc.7
而不用a.7
為什麼push acc
必須用acc
,而不能用
a,相反
movx @dptr
,a只能用
a,而不能用ac?
acc和
a有什麼區別?
accis register
。ais a unseparatable part of opcode
。在mov
指令中可通用,用
"a"時為2位元組
1週期;用
"acc"時為3
位元組2週期。
儘管實體地址相同,但push
是對暫存器操作,而
movx
是對累加器操作。
彙編結果:"inc a"
為"04h"
執行時間1週期
;"inc acc"為
"05h
,e0h"執行時間
2週期。
通俗的解釋為:acc
是位址為e0h
的暫存器,
a是標準的無位址的累加器,自然後者便捷,但兩者在值上互為映象
。
廣播變數與累加器
能不能將乙個rdd使用廣播變數廣播出去?不能 因為rdd是不存資料的。可以將rdd的結果廣播出去。廣播變數只能在driver端定義,不能在executor端定義。在driver端可以修改廣播變數的值,在executor端無法修改廣播變數的值。如果executor端用到了driver的變數,如果不使用...
Spark廣播變數與累加器
在dirver定義乙個變數,executor去使用,如果存在多個task,則會建立多個變數的副本,耗費記憶體。如果當前變數是乙個需要計算的值,在driver端是無法獲取的。scala實現 scala 實現 import org.apache.spark.util.doubleaccumulator ...
spark 廣播變數與累加器
如何理解廣播變數?適用場景 大變數,比如100m以上的大集合。運算元函式中使用到外部變數時,預設情況下,spark會將該變數複製多個副本,通過網路傳輸到task中,此時每個task都有乙個變數副本。如果變數本身比較大的話 比如100m,甚至1g 那麼大量的變數副本在網路中傳輸的效能開銷,以及在各個節...