2011-10-12 67 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

相关问题