關(guān)于累加器的問(wèn)題
劉玉蓉
發(fā)布于2014-09-18 17:19
1
0
標(biāo)簽:
請(qǐng)問(wèn)累加器記錄的是32位嗎?我用條指令將P##TABLE送給累加器1,第二條指令將累加器1中的數(shù)據(jù)傳送到AR1,當(dāng)#TABLE為DB4.DBW6時(shí),累加器2 ACCU 2為4,累加器1 ACCU1為84000030,見(jiàn)圖。參數(shù)類型pointer不是6個(gè)字節(jié)嗎?為何通過(guò)這個(gè)程序試驗(yàn)得到的結(jié)果是累加器2記錄的是Byte0和Byte1,而累加器1記錄的是Byte2 Byte3 Byte4 Byte5.當(dāng)超過(guò)32位的數(shù)值傳給累加器的時(shí)候,累加器應(yīng)如何記錄,當(dāng)小于32位的數(shù)值的時(shí)候累加器又應(yīng)該如何記錄。我想說(shuō)的是我的#TABLE數(shù)據(jù)類型是pointer,見(jiàn)圖,所以應(yīng)該是6個(gè)字節(jié)。為何累加器1得到的是Byte2 Byte3 Byte4 Byte5的數(shù)值,累加器2得到的是Byte0和Byte1的數(shù)據(jù)。而不是累加器1得到的是Byte4 Byte5,累加器2得到的是Byte0 Byte1 Byte2 Byte3的數(shù)據(jù)呢?
圖片說(shuō)明: 1,累加器
佳答案
對(duì)于FC的類型為Pointer的參數(shù),在塊調(diào)用時(shí)先通過(guò)累加器把Pointer類型數(shù)據(jù)的6個(gè)字節(jié)轉(zhuǎn)移到V區(qū)(上一層程序的本地?cái)?shù)據(jù),如果是OB1調(diào)用的這個(gè)FC,那么就是處于OB1的L區(qū)),所以你看到累加器1的內(nèi)容是后4個(gè)字節(jié)的區(qū)域地址,累加器2的內(nèi)容是前兩個(gè)字節(jié)的DB號(hào),你的斷點(diǎn)設(shè)置在條語(yǔ)句,程序執(zhí)行到斷點(diǎn)時(shí),條語(yǔ)句還沒(méi)有被執(zhí)行,累加器的值和后面的代碼沒(méi)有關(guān)系,L P##TABEL這條語(yǔ)句是把變量TABEL的地址裝載到累加器1,如果里監(jiān)控后面的,就可以發(fā)現(xiàn)這個(gè)地址的區(qū)域代碼是87,也就是V區(qū),這個(gè)參數(shù)的6個(gè)字節(jié)的值就被放在這個(gè)地址開(kāi)始的6個(gè)字節(jié)。
累加器是32位的不可能裝載超過(guò)32位的數(shù)據(jù)。
至于你后面說(shuō)的
“為何累加器1得到的是Byte2 Byte3 Byte4 Byte5的數(shù)值,累加器2得到的是Byte0和Byte1的數(shù)據(jù)。而不是累加器1得到的是Byte4 Byte5,累加器2得到的是Byte0 Byte1 Byte2 Byte3的數(shù)據(jù)呢?”
這個(gè)只有軟件的開(kāi)發(fā)者知道的為什么這么做,這個(gè)不是我們需要關(guān)心的,因?yàn)橹皇抢奂悠髟趬K調(diào)用時(shí)被系統(tǒng)使用了,其值我們不會(huì)用到,主要是程序在斷點(diǎn)處的語(yǔ)句并沒(méi)有被執(zhí)行,你可能沒(méi)注意到而產(chǎn)生誤解。