汇编-屏幕任意位置显示相应字符串的小程序

本文介绍了一个使用MASM(微软汇编器)进行编程的具体实例,通过设置特定的字符颜色及位置来显示一条欢迎消息。该实例展示了如何利用汇编语言进行屏幕输出控制,包括设置字符的前景色和背景色、指定输出的位置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

assume cs:code
data segment
db 'welcome to masm!' ;要显示的字符串
data ends
code segment
;DH 存储行号 <=25
;DL 列号 <=80
;CL 显示字符的前景色 背景色
;DS:SI   存储字符串的首地址
;行地址 = (DH-1H)*A0H
;列地址 = (DL-1)*2H
    show_str:              
mov aH,0
mov al,0A0H
mul DH
mov bp,ax
mov ax,0b800H
mov es,ax
mov aH,0
mov al,2
mul dl
mov di,ax
mov ah,0
mov al,cl
s:
mov ch,0H
mov cl,ds:[si]
jcxz p
mov ch,al
mov es:[bp+di],cx
inc si
add di,2H
jmp short s
p:
ret
    begin:
mov cl,01000010B
mov dh,10
mov dl,40
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,04c00H
int 21H
code ends
end begin
要用DOSBox和8086汇编语言实现一个程序,让用户输入一个字符串,并将其中的所有空格删除再显示出来,可以按照下面步骤设计。 ### 实现思路 1. **获取用户输入**:首先从键盘接收一串字符直到遇到回车键。 2. **遍历字符串查找空格**:逐一遍历每个字符判断是否为空格(ASCII码值为`32`)。 3. **过滤掉空格并将非空格字符存储到新的缓冲区中**:如果当前字符不是空格,则将其存入结果缓冲区;如果是空格则跳过该操作。 4. **打印处理后的字符串**:最后把不含空格的新字符串输出给屏幕。 以下是完整的示例代码片段: ```asm ; 设置数据段 data segment buffer db 100 dup(' ') ; 存储原始输入的空间 (最大长度=99+1) result db 100 dup(' ') ; 结果存放区域 count dw ? ; 记录有效字符数 ends stacks segment stack dw 100h dup('?') ; 定义栈空间大小 ends code segment assume cs: code, ds:data , ss:stacks start proc far mov ax,data mov ds,ax lea dx,message ; 提示信息地址赋dx寄存器 call print_string lea si,buffer ; 指向源字符串起始位置 xor di,di ; 初始化目标索引(di)等于零 cld ; 清除DF标志位 -> DF=0表示自动增加esi/di的偏移量 input_loop: mov ah,1 ; DOS中断读取单个按键服务 int 21h ; 调用INT 21H系统函数 cmp al,0dh ; 如果按下的是Enter键结束循环 je end_input scasb ; scasb - compare byte at [es:di] with AL jz skip_space ; 若匹配成功(al == ' '),就略去此字母不计入新数组里 stosb ; stosb - store value of AL into memory pointed by ES:[DI], then increment DI skip_space: jmp input_loop end_input: mov result[di],'$'; 给结果加终止符 lea dx,result ; 显示最终去除所有空白的结果 call print_string ; 屏幕上展示内容 exit_program: mov ax,4c00h ; 正常退出程序指令 int 21h print_string PROC near push ax push dx mov ah,9 ; 输出字符串功能编号 int 21h ; 执行调用 pop dx pop ax ret print_string ENDP message db "请输入一段文字:",'$' code ends end start ``` --- #### 解释说明: - `MOV AH,1` : 使用了DOS INT 21H 中断里的AH = 1 的功能,这是为了能一次只接受并返回用户的每一个击打出来的单独键值(AL 寄存器装载这个数值),而不是整个行作为整体传递回来。 - `SCASB`: 进行字节比较,在这里它检查AL 是否包含有空格(ASCII 值32)。如果有发现相同的元素存在的话,则会跳转至特定标签处忽略那个字符继续往下走流程;反之才会保留下来添加进我们的结果列表当中去保存起来留待后续进一步展现出来而已啦~ - `$` 符号是用来标记字符串末端的标准方法之一当涉及到MS-DOS下的文本输出的时候哦~ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值