(1)编写子程序参数 行,列,颜色,内容显示于屏幕上
DATAS SEGMENT ;此处输入数据段代码 db 'Welcome to masm!',0 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: mov ax,DATAS mov ds,ax ;此处输入代码段代码 mov dh,8 ;第8行 mov dl,3 ;第3列 mov cl,132 ;闪烁红色 10000100b mov si,0 call show_str MOV AH,4CH INT 21H ;第八行第三列就是 b8000h + 7*160+3*2 处开始显示 列以字为单位 show_str: mov al,dh sub ax,1 mov bl,160 mul bl push ax mov al,dl mov bl,2 mul bl pop bx add ax,bx mov bx,0b800h mov es,bx mov si,ax mov bx,0 mov ah,cl ;颜色填充ax高位 s: mov al,[bx] ;字符填充ax低位 mov es:[si],ax ;复制到现存对应位置 add bx,1 add si,2 mov cl,al jcxz ok ;遇到0结尾字符串跳出循环 jmp short s ok: ret CODES ENDS END START
(2)除法溢出处理
DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 mov ax,4240H mov dx,000fH mov cx,0aH call divdw MOV AH,4CH INT 21H ;X/N = int(H/N)*65536 + [rem(H/N)*65536+L]/N divdw: push ax mov ax,dx mov dx,0 div cx ;(H/N) 此时 (ax)= int(H/N) (dx) = rem(H/N) mov bx,ax ; (bx) = int(H/N) pop ax div cx ;[rem(H/N)*65536+L]/N 因为上一步div 相当于把 rem(H/N)* 65536 存放到高位寄存器dx 此时把L出栈存放到了低位寄存器ax mov cx,dx ; 余数放cx ax就是结果的低16位 mov dx,bx ;int(H/N)*65536 因为dx是高位存放寄存器相当于左移16位 ret CODES ENDS END START