You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:40:16