显示字符串子程序

名称:show_str

功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串

参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),

  (cl)=颜色,ds:si指向字符串的首地址

返回:无

应用举例:在屏幕的8行3列,用绿色显示data段中的字符串。

assume  cs:code    

data   segment
       db   'welcome to masm!', 0
data    ends   

code    segment

start:      mov   dh,8
            mov   dl,3
            mov   cl,2
            mov   ax,data
            mov   ds,ax
            mov   si,0
            call  show_str

            mov   ax,4c00h
            int   21h

show_str:
       push es
       push ax
       push bp
       push di
       push si
mov ax, 0b800h mov es, ax mov al, cl mov bp, 0 mov ch, 0 mov cl, dh s0: add bp, 160 loop s0 ;循环计算行偏移量
mov di, 0 mov ch, 0 mov cl, dl
s1:
add di,2 loop s1 ;循环计算列偏移量
s2: mov cl,ds:[si] jcxz s3 mov es:[bp + di],cl ;字符 inc di mov es:[bp +di], al ;颜色 inc di inc si loop s2 s3:
       pop si
pop di
pop bp
        pop ax
        pop es

        ret code ends end start

 

转载于:https://www.cnblogs.com/gkp307/p/9928555.html

;birr7-6.asm in DOS include io16.inc .data intmsg byte 'A 8259A Interrupt ! Count: ',0 counter byte 0 ;中断次数记录单元 countmsg byte 10 dup(?) ;用于存储计数的ASCII码 .code start: mov ax,@data mov ds,ax mov ax,3508h ;获取原中断向量 int 21h push es ;保存原中断向量(利用堆栈) push bx cli ;关中断 push ds ;设置新中断向量 mov ax,seg new08h mov ds,ax mov dx,offset new08h mov ax,2508h int 21h pop ds in al,21h ;读出IMR push ax ;保存原IMR内容 and al,0feh ;允许IRQ0,其他不变 out 21h,al ;设置新IMR内容 mov counter,0 ;设置中断次数初值 sti ;开中断 ;主程序完成中断服务程序设置,可以处理其他事务 start1: cmp counter,10 ;本例的主程序仅循环等待中断 jb start1 ;中断10次退出 ; cli ;关中断 pop ax ;恢复IMR out 21h,al pop dx ;恢复原中断向量 pop ds mov ax,2508h int 21h sti ;开中断 exit 0 ; 中断服务程序 new08h proc sti ;开中断 push ax ;保护寄存器 push bx push cx push si push ds mov ax,@data ;外部随机产生中断,DS也不确定,所以必须设置DS mov ds,ax inc counter ;中断次数加1 ; 检查是否为偶数次中断 (counter-1是偶数时显示) mov al, counter dec al ; 调整为实际中断次数(从1开始) test al, 1 ; 检查最低位 jnz skip_display ; 如果是奇数,跳过显示 ; 显示中断信息 mov si,offset intmsg ;显示信息 call dpstri ; 将计数值转换为ASCII并显示 mov al, counter mov bx, offset countmsg call byte2asc mov si, bx call dpstri skip_display: mov al,20h ;发送EOI命令 out 20h,al pop ds ;恢复寄存器 pop si pop cx pop bx pop ax iret ;中断返回 new08h endp ; 显示字符串子程序 dpstri proc ;入口参数:DS:SI=字符串首址 push ax push bx dps1: mov al,[si] cmp al,0 jz dps2 mov bx,0 ;调用ROM-BIOS功能显示al中的字符 mov ah,0eh int 10h inc si jmp dps1 dps2: pop bx pop ax ret dpstri endp ; 字节转ASCII字符串子程序 byte2asc proc ; 入口参数: AL=字节值, BX=存储结果的缓冲区地址 push ax push bx push cx push dx mov cx, 0 ; 计数器清零 mov dx, 0 ; 高位清零 ; 转换个位 mov bl, 10 div bl ; AX/10 -> AL=商, AH=余数 add ah, '0' ; 余数转为ASCII mov [bx], ah ; 保存个位 inc bx inc cx ; 如果商大于0,处理十位 cmp al, 0 je convert_done add al, '0' ; 商转为ASCII mov [bx], al ; 保存十位 inc cx convert_done: ; 反转字符串 mov si, offset countmsg mov di, bx dec di reverse_loop: cmp si, di jge reverse_done mov al, [si] mov ah, [di] mov [si], ah mov [di], al inc si dec di jmp reverse_loop reverse_done: ; 添加字符串结束符 mov byte ptr [bx], 0 pop dx pop cx pop bx pop ax ret byte2asc endp end start 这个代码有没有错误,并分析作用
05-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值