Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 英特尔8085汇编中的位移位操作是做什么的?_Assembly_Bitwise Operators_Bcd_8085 - Fatal编程技术网

Assembly 英特尔8085汇编中的位移位操作是做什么的?

Assembly 英特尔8085汇编中的位移位操作是做什么的?,assembly,bitwise-operators,bcd,8085,Assembly,Bitwise Operators,Bcd,8085,我试图向自己解释以下8085汇编代码 我的代码要求输入两个数字(来自IDE中的虚拟键盘),并将它们显示在LED 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

我试图向自己解释以下8085汇编代码

我的代码要求输入两个数字(来自IDE中的虚拟键盘),并将它们显示在LED 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
这是程序的开始-就像Pascal中的
BEGIN

调用数据
是一个子程序,它用二进制零填充累加器,并在端口0(00H十六进制)中显示它们(?),然后(从虚拟键盘)获取一个数字,然后在位移位操作中向左旋转


我的问题是为什么?这样做有什么意义?有什么好处?我在维基百科上读到过,但我还是不明白。它在这个代码中做什么?为什么需要它?

子例程加载两个ASCII十进制字符,并将它们形成一个两位数的值。它将第一个字符向左移位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;
char c=getchar();//获取第一个ASCII十进制字符
字符结果=(c0x04


为了帮助说明这一点,我绘制了一张图表,逐步显示当用户输入数字“69”时会发生什么,即ASCII“6”后跟ASCII“9”,因为这两个字符被屏蔽并组合在一起,以给出数字69的BCD表示:


Paul,这并没有问我的问题…为什么?这样做有什么意义?好处是什么?我在维基百科上读过,但我仍然不明白。它在这段代码中做了什么,为什么需要它。@Ashir:进一步回答问题“为什么”:您的程序需要将两个4位值放入一个8位寄存器-如何操作?它需要将其中一个4位值向上移动到8位值的前四位,然后将另一个4位值放入低位4位。为了实现这一点,需要将其中一个值左移4位,并适当屏蔽这两个值也许一张图表会有帮助?好吧-我建议你不要只是决定你“不明白”也许你应该花更多的时间来学习这个例子——在纸上写下笔记,并画一些8位结果寄存器的图表。你需要知道的一切都在上面解释过了——你只需要一点耐心和毅力就能理解它。祝你好运!是的,他们应该有一个“极度耐心”的徽章如果你对自己的答案评论了5次以上,我支持+1表示极度耐心,保罗,如果他仍然不明白,那肯定不是你的错。