2011-10-12 139 views
4

我想對自己解釋下8085彙編代碼英特爾8085彙編中的bitshift操作是做什麼的?

我有這樣的代碼是兩個數要求(從IDE內的虛擬鍵盤),並顯示在發光二極管7,8:

.ORG 0000 

CALL DATA 
MOV C,A 
CALL PRNT 

CALL DATA 
MOV E,A 
CALL PRNT 

MVI D,00H 
MOV L,E 
MVI H,00H 

MOV A,C 
DCR A 
JUMP: 
DAD D 
DCR A 
JNZ JUMP 

MOV A,L 
DAA 
JMP IMPR 

RET 

DATA: 
MVI A,00000000B 
OUT 00H 
IN 00H 
RLC 
RLC 
RLC 
RLC 
ANI F0H 
MOV B,A 
MVI A,00000000B 
OUT 00H 
IN 00H 
ANI 0FH 
ORA B 
RET 

IMPR: 
MOV B,A 

ANI F0H 
RLC 
RLC 
RLC 
RLC 
CALL NUMZ 
OUT 06H 
MOV A,B 
ANI 0FH 
CALL NUMZ 
OUT 07H 
RET 

NUMZ: 
CPI 00H 
JNZ ONE 
MVI A,01110111B 
JMP EXIT 

ONE: 
CPI 01H 
JNZ TWO 
MVI A,01000100B 
JMP EXIT 

TWO: 
CPI 02H 
JNZ THREE 
MVI A,00111110B 
JMP EXIT 

THREE: 
CPI 03H 
JNZ FOUR 
MVI A,01101110B 
JMP EXIT 

FOUR: 
CPI 04H 
JNZ FIVE 
MVI A,01001101B 
JMP EXIT 

FIVE: 
CPI 05H 
JNZ SIX 
MVI A,01101011B 
JMP EXIT 

SIX: 
CPI 06H 
JNZ SEVEN 
MVI A,01111011B 
JMP EXIT 

SEVEN: 
CPI 07H 
JNZ EIGHT 
MVI A,01000110B 
JMP EXIT 

EIGHT: 
CPI 08H 
JNZ NINE 
MVI A,01111111B 
JMP EXIT 

NINE: 
CPI 09H 
JNZ SAL 
MVI A,01001111B 
JMP EXIT 

EXIT: 
RET 

我不包括PRNT,因爲這對我的問題並不重要。

我明白.ORG 0000這是程序的開始 - 它就像帕斯卡爾的BEGIN

CALL DATA是充滿二進制零累加器和顯示他們(?)在端口0子程序(十六進制00H),然後它會(從虛擬鍵盤),一個數字和然後它的左移在位移操作。

我的問題是爲什麼?這樣做有什麼意義?有什麼好處?我已經在維基百科上閱讀過它,但我仍然不明白。它在這段代碼中做了什麼,它爲什麼需要?

回答

7

DATA子程序正在加載兩個ASCII十進制字符並將它們組成一個兩位數的BCD值。它將第一個字符左移4位,僅保留LS 4位,然後將第二個字符的LS 4位放入結果的LS 4位。

在C,這將是大致相當於:

char c = getchar();    // get first ASCII decimal character 
char result = (c << 4) & 0xf0; // shift into MS nybble of result and mask 
c = getchar();     // get second ASCII decimal characters 
result = result | (c & 0x0f); // mask and inset into LS nybble of result 
return result; 

注意屏蔽所有,但一個ASCII字符的十進制的LS半字節爲您提供了相應的十進制數,例如ASCII'4'= 0x34 => 0x04。


爲了明確這一點我已經繪製的示意圖,它表示一步一步當用戶輸入數字「69」,即ASCII「6」,然後ASCII「9」,因爲發生了什麼兩個字符被屏蔽,併合並得到數69的BCD表示:

enter image description here

+0

保羅,不問我的問題......爲什麼呢?什麼是在幹什麼這麼點?有什麼好處??? 我已經在維基百科上閱讀過它,但我仍然不明白。 它在這段代碼中做了什麼以及它爲什麼需要它。 – Ashir

+0

以上答案的哪部分你不明白? 4'RLC'指令相當於C中的'<< 4' - 是什麼令你困惑? –

+0

爲什麼你需要旋轉它們?爲什麼?,幹什麼這麼做?,有什麼好處?它在這段代碼中做了什麼以及它爲什麼需要它...... – Ashir

相關問題