如何在MASM611中无数据段实现8位二进制相加转十进制输出
8位二进制数相加并输出十进制结果的MASM汇编实现
以下是符合要求的完整汇编程序,全程使用寄存器存储数据,不使用数据段,基于你提供的读写字符基础程序扩展实现:
.MODEL SMALL .STACK .CODE main proc ; 读取第一个8位二进制数,存入BL MOV CX, 8 MOV BL, 0 input_first: CALL read_char CMP DL, CR JE input_first_end SUB DL, '0' SHL BL, 1 OR BL, DL LOOP input_first input_first_end: CALL cr_lf ; 读取第二个8位二进制数,存入BH MOV CX, 8 MOV BH, 0 input_second: CALL read_char CMP DL, CR JE input_second_end SUB DL, '0' SHL BH, 1 OR BH, DL LOOP input_second input_second_end: CALL cr_lf ; 计算两数之和,结果存入AX MOV AX, 0 MOV AL, BL ADD AL, BH ADC AH, 0 ; 将十进制结果转换为字符输出(处理前导零) MOV CH, 0 ; 标记是否已输出非零数字,0=未输出 ; 处理百位 MOV CL, 100 DIV CL ; AL=百位数字,AH=余数 CMP AL, 0 JE check_tens ADD AL, '0' MOV DL, AL CALL write_char MOV CH, 1 check_tens: ; 处理十位 MOV AL, AH MOV AH, 0 MOV CL, 10 DIV CL ; AL=十位数字,AH=个位数字 CMP CH, 1 JNE check_tens_zero ADD AL, '0' MOV DL, AL CALL write_char JMP check_units check_tens_zero: CMP AL, 0 JE check_units ADD AL, '0' MOV DL, AL CALL write_char MOV CH, 1 check_units: ; 处理个位 ADD AH, '0' MOV DL, AH CALL write_char CALL cr_lf ; 程序退出 MOV AH, 4CH INT 21h main endp CR EQU 13 LF EQU 10 cr_lf proc PUSH DX MOV DL, CR CALL write_char MOV DL, LF CALL write_char POP DX RET cr_lf endp read_char proc PUSH AX MOV AH, 1 INT 21h MOV DL, AL POP AX RET read_char endp write_char proc PUSH AX MOV AH, 2 INT 21h POP AX RET write_char endp END main
关键说明
- 输入处理:每次读取一个字符,判断是否为回车(支持提前结束输入),将字符
'0'/'1'转换为数值后通过移位和或操作存入寄存器 - 求和逻辑:使用
ADD和ADC指令处理8位相加可能产生的进位,最终结果存入AX寄存器 - 十进制输出:通过除法拆分百位、十位、个位,自动处理前导零问题,确保输出符合常规十进制阅读习惯
内容的提问来源于stack exchange,提问作者Elemér Úram Kalapós
相关产品推荐
相关产品推荐

