使用循环将十进制转换为二进制并显示它 - 汇编语言 EMU 8086
Converting decimal to binary using loop and displaying it - Assembly Language EMU 8086
在下面的代码中,我试图将计数值转换为二进制值,然后显示它。该代码似乎不起作用,只在应该显示 1 时显示 1,例如 1000 表示 8,但它为每个值显示一个。关于我应该更改或改进我的代码的任何建议?
我也尝试显示一个计数器,但在失败后放弃了,我使用 N1
、N2
等来显示数字,而不是使用循环,这会使我的代码缩短一个英里并改进它。请也给我一些建议:)
假设我想从 0 或 1 开始计数器,我想显示的值应该是 ascii 码还是十六进制?例如,我想显示数字 5,然后显示数字 6。(示例将显示在第二个代码段中)。代码 2 可以吗?应该改变什么才能让它发挥作用?是否应该将 ascii 值放入 CX
?我应该改用内存变量吗?
CODE 2 NOTE: 2点代表代码省略,如有不明白的地方请追问。请不要介意这些问题,我在编码方面仍然是一个业余爱好者,做最简单的事情也有困难。谢谢阅读 :)
这是为需要它的人提供的整个程序的代码:Full Code Here
代码 1:
OUT1 MACRO COUNT ;new macro added, edit date 7th july
MOV CL,COUNT
MOV AL,CL
MOV DX,0378H
OUT DX,AL
ENDM
CURSOR MACRO Col, Row
push ax
MOV AH,02
MOV BH,00
MOV DL,Col
MOV DH,Row
INT 10H
pop ax
ENDM
DISP MACRO MES
push ax
MOV AH,09
MOV DX,OFFSET MES
INT 21H
pop ax
ENDM
.DATA
.
.
N0 DB '0','$'
N1 DB '1','$'
N2 DB '2','$'
N3 DB '3','$'
N4 DB '4','$'
N5 DB '5','$'
N6 DB '6','$'
N7 DB '7','$'
N8 DB '8','$'
N9 DB '9','$'
COUNT DB 0
TWO DB 2
STR1 DB 4 DUP('$') ; ADDED NEW
COL1 DB 36 ; ADDED NEW
.
.
.code
.
MOV COUNT,5
.
.
BINARY: LEA SI,STR1
PUSH CX
MOV CL,4
BINL1: MOV AL,COUNT
CBW
DIV TWO
MOV BYTE PTR[SI],AH
INC SI
DEC CL
JNZ BINL1
POP CX
JMP PRINTBINARY
PRINTBINARY: MOV AH, BYTE PTR[SI]
PUSH CX
PUSH AX
MOV CL,4
PBIN1: CURSOR COL1,22 ; 36,22 then 35,22 to 33,22
CMP AH,0
JE ZERO
JNE ONE
ZERO: DISP N0
JMP X
ONE: DISP N1
x: DEC SI
DEC CL
JNZ PBIN1
POP AX
POP CX
JMP L0
代码 2:
mov cx,5
disp cx
inc cx
disp cx
我测试了链接代码。问题是从数字 ("count") 转换为二进制 ("str1") 的算法。我做了三处更改,corruptdna 必须替换您代码中的下一个代码并且 运行 它:
1. 向变量"str1" 增加了一个字节以在末尾存储'$'并用int 21h 显示它,ah=9 :
STR1 DB 5 DUP('$')
2. 更改了算法以将数字 ("count") 转换为二进制 ("str1")。除法不是正确的方法,我右移了位,将每个提取的位转换为“0”或“1”并将这些字符存储在 "str1" 中:
BINARY: MOV SI,OFFSET STR1+3 ;POSITION OF THE LEAST SIGNIFICANT BIT (EXTREME RIGHT).
PUSH CX
MOV CL,4
MOV AL,COUNT
BINL1:
SHR AL, 1 ;PUSH BITS TO THE RIGHT. BIT 0 IN CARRY FLAG.
JC BIT_1 ;IF ( CARRY FLAG == 1 ) JUMP TO BIT_1.
MOV [ BYTE PTR SI ], '0' ;IF NO JUMP, BIT IS ZERO.
JMP NEXT_BIT ;SKIP "BIT_1".
BIT_1: MOV [ BYTE PTR SI ], '1'
NEXT_BIT:
DEC SI ;NEXT BIT POSITION IS TO THE LEFT.
DEC CL
JNZ BINL1
POP CX
JMP PRINTBINARY
3.最后显示"str1"(以'$'结尾):
PRINTBINARY: CURSOR 36,22 ; 36,22 then 35,22 to 33,22
MOV AH, 9 ;SERVICE TO DISPLAY STRING '$' ENDED.
MOV DX, OFFSET STR1 ;STRING TO DISPLAY ('$' ENDED).
INT 21H
JMP L0
在下面的代码中,我试图将计数值转换为二进制值,然后显示它。该代码似乎不起作用,只在应该显示 1 时显示 1,例如 1000 表示 8,但它为每个值显示一个。关于我应该更改或改进我的代码的任何建议?
我也尝试显示一个计数器,但在失败后放弃了,我使用 N1
、N2
等来显示数字,而不是使用循环,这会使我的代码缩短一个英里并改进它。请也给我一些建议:)
假设我想从 0 或 1 开始计数器,我想显示的值应该是 ascii 码还是十六进制?例如,我想显示数字 5,然后显示数字 6。(示例将显示在第二个代码段中)。代码 2 可以吗?应该改变什么才能让它发挥作用?是否应该将 ascii 值放入 CX
?我应该改用内存变量吗?
CODE 2 NOTE: 2点代表代码省略,如有不明白的地方请追问。请不要介意这些问题,我在编码方面仍然是一个业余爱好者,做最简单的事情也有困难。谢谢阅读 :) 这是为需要它的人提供的整个程序的代码:Full Code Here
代码 1:
OUT1 MACRO COUNT ;new macro added, edit date 7th july
MOV CL,COUNT
MOV AL,CL
MOV DX,0378H
OUT DX,AL
ENDM
CURSOR MACRO Col, Row
push ax
MOV AH,02
MOV BH,00
MOV DL,Col
MOV DH,Row
INT 10H
pop ax
ENDM
DISP MACRO MES
push ax
MOV AH,09
MOV DX,OFFSET MES
INT 21H
pop ax
ENDM
.DATA
.
.
N0 DB '0','$'
N1 DB '1','$'
N2 DB '2','$'
N3 DB '3','$'
N4 DB '4','$'
N5 DB '5','$'
N6 DB '6','$'
N7 DB '7','$'
N8 DB '8','$'
N9 DB '9','$'
COUNT DB 0
TWO DB 2
STR1 DB 4 DUP('$') ; ADDED NEW
COL1 DB 36 ; ADDED NEW
.
.
.code
.
MOV COUNT,5
.
.
BINARY: LEA SI,STR1
PUSH CX
MOV CL,4
BINL1: MOV AL,COUNT
CBW
DIV TWO
MOV BYTE PTR[SI],AH
INC SI
DEC CL
JNZ BINL1
POP CX
JMP PRINTBINARY
PRINTBINARY: MOV AH, BYTE PTR[SI]
PUSH CX
PUSH AX
MOV CL,4
PBIN1: CURSOR COL1,22 ; 36,22 then 35,22 to 33,22
CMP AH,0
JE ZERO
JNE ONE
ZERO: DISP N0
JMP X
ONE: DISP N1
x: DEC SI
DEC CL
JNZ PBIN1
POP AX
POP CX
JMP L0
代码 2:
mov cx,5
disp cx
inc cx
disp cx
我测试了链接代码。问题是从数字 ("count") 转换为二进制 ("str1") 的算法。我做了三处更改,corruptdna 必须替换您代码中的下一个代码并且 运行 它:
1. 向变量"str1" 增加了一个字节以在末尾存储'$'并用int 21h 显示它,ah=9 :
STR1 DB 5 DUP('$')
2. 更改了算法以将数字 ("count") 转换为二进制 ("str1")。除法不是正确的方法,我右移了位,将每个提取的位转换为“0”或“1”并将这些字符存储在 "str1" 中:
BINARY: MOV SI,OFFSET STR1+3 ;POSITION OF THE LEAST SIGNIFICANT BIT (EXTREME RIGHT).
PUSH CX
MOV CL,4
MOV AL,COUNT
BINL1:
SHR AL, 1 ;PUSH BITS TO THE RIGHT. BIT 0 IN CARRY FLAG.
JC BIT_1 ;IF ( CARRY FLAG == 1 ) JUMP TO BIT_1.
MOV [ BYTE PTR SI ], '0' ;IF NO JUMP, BIT IS ZERO.
JMP NEXT_BIT ;SKIP "BIT_1".
BIT_1: MOV [ BYTE PTR SI ], '1'
NEXT_BIT:
DEC SI ;NEXT BIT POSITION IS TO THE LEFT.
DEC CL
JNZ BINL1
POP CX
JMP PRINTBINARY
3.最后显示"str1"(以'$'结尾):
PRINTBINARY: CURSOR 36,22 ; 36,22 then 35,22 to 33,22
MOV AH, 9 ;SERVICE TO DISPLAY STRING '$' ENDED.
MOV DX, OFFSET STR1 ;STRING TO DISPLAY ('$' ENDED).
INT 21H
JMP L0