如何在MASM611中获取多字符输入?需实现二进制与运算功能
8位二进制数AND运算解决方案(无数据段+指定子程序)
以下是符合要求的完整DOS汇编代码,基于你提供的read_char和write_char子程序实现,全程不使用数据段:
stack segment stack dw 100h dup(?) stack ends code segment start: ; 提示输入第一个二进制数 mov dl, 'E' call write_char mov dl, 'n' call write_char mov dl, 't' call write_char mov dl, 'e' call write_char mov dl, 'r' call write_char mov dl, ' ' call write_char mov dl, '1' call write_char mov dl, 's' call write_char mov dl, 't' call write_char mov dl, ' ' call write_char mov dl, '8' call write_char mov dl, '-' call write_char mov dl, 'b' call write_char mov dl, 'i' call write_char mov dl, 't' call write_char mov dl, ' ' call write_char mov dl, 'b' call write_char mov dl, 'i' call write_char mov dl, 'n' call write_char mov dl, 'a' call write_char mov dl, 'r' call write_char mov dl, 'y' call write_char mov dl, ':' call write_char mov dl, ' ' call write_char ; 读取第一个8位二进制数到BL mov bl, 0 mov cx, 8 read_first: call read_char sub dl, '0' ; 把字符'0'/'1'转成0/1数值 shl bl, 1 ; BL左移一位,腾出最低位 or bl, dl ; 将当前位存入BL最低位 loop read_first ; 换行 mov dl, 0Dh call write_char mov dl, 0Ah call write_char ; 提示输入第二个二进制数 mov dl, 'E' call write_char mov dl, 'n' call write_char mov dl, 't' call write_char mov dl, 'e' call write_char mov dl, 'r' call write_char mov dl, ' ' call write_char mov dl, '2' call write_char mov dl, 'n' call write_char mov dl, 'd' call write_char mov dl, ' ' call write_char mov dl, '8' call write_char mov dl, '-' call write_char mov dl, 'b' call write_char mov dl, 'i' call write_char mov dl, 't' call write_char mov dl, ' ' call write_char mov dl, 'b' call write_char mov dl, 'i' call write_char mov dl, 'n' call write_char mov dl, 'a' call write_char mov dl, 'r' call write_char mov dl, 'y' call write_char mov dl, ':' call write_char mov dl, ' ' call write_char ; 读取第二个8位二进制数到BH mov bh, 0 mov cx, 8 read_second: call read_char sub dl, '0' shl bh, 1 or bh, dl loop read_second ; 换行 mov dl, 0Dh call write_char mov dl, 0Ah call write_char ; 执行AND运算:结果存回BL and bl, bh ; 提示输出结果 mov dl, 'R' call write_char mov dl, 'e' call write_char mov dl, 's' call write_char mov dl, 'u' call write_char mov dl, 'l' call write_char mov dl, 't' call write_char mov dl, ':' call write_char mov dl, ' ' call write_char ; 输出8位结果 mov cx, 8 output_result: shl bl, 1 ; 左移BL,最高位移入进位标志CF mov dl, '0' adc dl, 0 ; 根据CF的值将DL设为'0'或'1' call write_char loop output_result ; 程序退出 mov ah, 4Ch int 21h ; 你提供的子程序 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 code ends end start
关键逻辑说明
- 输入二进制数:
循环8次调用read_char读取每一位,通过sub dl, '0'将ASCII字符转换为0/1数值;用shl左移寄存器腾出位置,再通过or将当前位存入寄存器,最终把8位数据整合到BL/BH中。 - AND位运算:直接使用
and bl, bh指令完成运算,结果保留在BL寄存器。 - 输出结果:
循环8次,通过shl bl, 1将结果的最高位移入进位标志CF;用adc dl, 0根据CF的值生成对应ASCII字符'0'或'1',再调用write_char输出。 - 无数据段实现:所有提示字符直接通过给DL赋值ASCII码输出,无需存储在数据段。
内容的提问来源于stack exchange,提问作者kur0bane
相关产品推荐
相关产品推荐

