1. 显示字符串
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 ; 在指定的位置,用指定的颜色,显示一个用0结束的字符串 ; 参数: (dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79), ; (cl)=颜色,ds:si指向字符串的首地址 ; 返回:无 show_str: mov ax,0b800h mov es,ax mov di,0 ;显存0页的0行0列 mov al,160 ;计算行开始 mul dh add di,ax mov al,2 ;计算列开始 mul dl add di,ax mov bl,cl s: mov cl,[si] mov ch,0 jcxz ok mov es:[di],cl mov es:[di+1],bl ;color inc si add di,2 loop s ok: ret code ends end start
2. 解决除法溢出的问题
这道题的意思很简单,就是将被除数的高16位除以除数得到的结果作为结果的高16位,而被除数的低16位除以除数得到的结果作为结果的低16位。
assume cs:code code segment start: mov ax,4240H ;低16位 mov dx,000FH ;高16位 mov cx,0AH ;除数 --> 余数 call divdw mov ax,4c00h int 21h ; 功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型 ; 参数:(ax)=dword型数据的低16位 ; (dx)=dword型数据的高16位 ; (cx)=除数 ; 返回:(dx)=结果的高16位,(ax)=结果的低16位 ; (cx)=余数 divdw: mov bx,ax ; 保存低位 mov ax,dx ;高位运算 mov dx,0H ; 进行H/N 的运算 div cx ; 因为除数为16位的,使用div,则设置的被除数为32位 ;除数为16位,商存在ax中,余数存在dx中 mov si,ax ; 用于保存int(H/N),因为rem(H/N)*65536就相当于高16位,dx了,故得到的余数在dx直接做高位 mov ax,bx ; [rem(H/N)*65536+L] div cx ; [rem(H/N)*65536+L]/N,结果是的ax保存为16位的低位 ;除数为16位,商存在ax中,余数存在dx中 mov cx,dx ; 将余数写入cx mov dx,si ; 将高位写入dx ret code ends end start
3. 数值显示
assume cs:code data segment db 10 dup (0) ; 用于存入转换为ASCII码的数据 data ends code segment start: mov ax,12666 mov bx,data mov ds,bx mov si,0 call dtoc ;显示:8行3列绿色字体 mov dh,8 mov dl,3 mov cl,2 call show_str mov ax,4c00h int 21h dtoc: mov si,8 s0: mov cx,10 mov dx,0 div cx add dx,30H mov [si],dl ;写入一个字节 mov cx,ax jcxz break dec si inc cx loop s0 break: ret show_str: mov ax,0B800H ;显存开始位置 mov es,ax mov di,0 mov al,0A0H ;计算行开始位置 mul dh add di,ax mov al,2 ;计算列开始位置 mul dl add di,ax mov bl,cl s: mov cl,[si] mov ch,0 jcxz ok mov es:[di],cl ;向显存写数据 mov es:[di+1],bl add di,2 inc si loop s ok: ret code ends end start