汇编语言编一程序,从键盘输入二位十六进制数,统计其对应的二进制数中含1的个数,并在下一行以十进制显示出来。
时间: 2023-12-17 12:02:51 浏览: 108
汇编语言;输入16进制,输出10进制
以下是 x86 汇编语言的程序,可在 DOS 或 Windows 下运行:
```
.MODEL SMALL
.STACK 100h
.DATA
hex DB 2 DUP(?) ; 存储输入的十六进制数
bin DB 8 DUP(0) ; 存储转换后的二进制数
count DW 0 ; 存储含1的个数
msg1 DB '请输入一个二位十六进制数:', 0Ah, 0Dh, '$'
msg2 DB '对应的二进制数为:', 0Ah, 0Dh, '$'
msg3 DB '其中含1的个数为:', 0Ah, 0Dh, '$'
buffer DB 20 DUP(0) ; 存储转换后的十进制数字符串
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 输出提示信息
MOV AH, 9
LEA DX, msg1
INT 21h
; 读取十六进制数
MOV AH, 1
INT 21h
MOV hex[0], AL
INT 21h
MOV hex[1], AL
; 转换为二进制数并统计含1的个数
MOV BX, 0
MOV CX, 8
MOV SI, 0
convert_loop:
MOV AL, hex[SI]
CMP AL, '0'
JGE check_digit
SUB AL, 'A' - 10
JMP convert_next
check_digit:
CMP AL, '9'
JLE convert_next
SUB AL, 'a' - 10
convert_next:
CMP BX, 8
JE count_bits
MOV BL, 0
digit_loop:
SHL AL, 1
RCL BL, 1
JNC zero_bit
INC count
zero_bit:
LOOP digit_loop
MOV bin[BX], BL
INC BX
INC SI
JMP convert_loop
count_bits:
; 输出二进制数
MOV AH, 9
LEA DX, msg2
INT 21h
MOV CX, 8
MOV SI, 0
print_bin_loop:
MOV AL, bin[SI]
OR AL, '0'
MOV AH, 2
INT 21h
INC SI
LOOP print_bin_loop
; 输出含1的个数
MOV AH, 9
LEA DX, msg3
INT 21h
MOV AX, count
CALL WORD2DEC
MOV SI, OFFSET buffer
CALL PRINT_STRING
; 程序结束
MOV AH, 4Ch
INT 21h
MAIN ENDP
; 将 16 位的十进制数字转换为字符串
WORD2DEC PROC
PUSH AX
PUSH BX
MOV BX, 10
MOV CX, 0
word2dec_loop:
XOR DX, DX
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNE word2dec_loop
MOV BX, 0
dec2str_loop:
POP DX
ADD DL, '0'
MOV BYTE PTR [buffer+BX], DL
INC BX
LOOP dec2str_loop
POP BX
POP AX
RET
WORD2DEC ENDP
; 输出字符串
PRINT_STRING PROC
PUSH AX
PUSH BX
PUSH CX
MOV AH, 9
print_loop:
MOV AL, [SI]
CMP AL, '$'
JE print_end
INT 21h
INC SI
JMP print_loop
print_end:
POP CX
POP BX
POP AX
RET
PRINT_STRING ENDP
END MAIN
```
该程序通过循环将输入的十六进制数转换为二进制数,并在转换过程中统计含1的个数。最后将二进制数和含1的个数输出。
阅读全文