lab13-1.Asm 代码:
assume cs:code code segment start: ;把int 7ch中断例程安装到0:200h处 ;ds:si指向将要复制的程序地址 mov ax,cs mov ds,ax mov si,offset show_str ;es:di指向目的地址 mov ax,0 mov es,ax mov di,200h ;设置循环次数cx mov cx,offset show_str_end - offset show_str ;设置si di递增 cld ;将字符串从di:si复制到es:di rep movsb ;设置中断向量表 ;es指向0 mov ax,0 mov es,ax ;目的偏移地址为:4*n 4*n+2 mov word ptr es:[4*7ch],200h mov word ptr es:[4*7ch+2],0 ;安装程序返回 mov ax,4c00h int 21h ;编写int 7ch中断例程 ;功能:显示一个以0结尾的字符串 ;参数:dh=行号(*160)dl=列号(*2)cl=颜色 ds:si指向字符串首地址 ;返回:无 show_str: push ax push bx push cx push dx push si push di push es ;设置es:di指向目的地址 mov ax,0b800h mov es,ax mov di,0 ;di必须先设置为0 ;先用bx来保存参数(dh行号、dl列号) mov bx,dx ;求列dl偏移量 mov ax,2 mov dh,0 mul dx add di,ax ;结果低16位在ax中存放,故将di加上列偏移量 ;求行dh偏移量 mov ax,160 mov dl,bh mov dh,0 mul dx add di,ax ;结果低16位在ax中存放,故将di加上行偏移量 ;先用bl来保存颜色参数cl mov bl,cl ;ds:si指向要复制的字符串首地址 copy: mov cl,[si] mov ch,0 jcxz ok mov es:[di],cl ;放字符cl进去 inc di mov es:[di],bl ;放颜色bl进去 inc si inc di jmp short copy ok: pop es pop di pop si pop dx pop cx pop bx pop ax iret show_str_end: nop code ends end start
tlab13-1.Asm代码:
data segment db "welcome to masm!",0 data ends code segment start: mov dh,10 mov dl,10 mov cl,2 mov ax,data mov ds,ax mov si,0 int 7ch mov ax,4c00h int 21h code ends end start
在win 10 dosbox环境下的运行结果:
实验(2)
代码:
assume cs:code code segment start: ;1)安装 ;ds:si - original int coding address mov ax,cs mov ds,ax mov si,offset lp ;"lp" is short for loop ;es:di - 0:200h 被复制的地址 mov ax,0 mov es,ax mov di,200h ;写入 0:200h mov cx,offset lpend - offset lp cld ;inc si,inc di rep movsb ;copy bytes ;2)写入中断向量表 es:di=0:4*7ch 0:4*7ch+2 mov ax,0 mov es,ax mov word ptr es:[4*7ch],200h mov word ptr es:[4*7ch+2],0 mov ax,4c00h int 21h ;3)新的int 7ch代码 lp: push bp mov bp,sp dec cx jcxz ok add [bp+2],bx ;make ip to loop start ok: pop bp iret lpend:nop code ends end start
在win 10 dosbox环境下的运行结果:
实验(3)
代码:
assume cs:code code segment s1: db 'this is s1','$' s2: db 'this is s2','$' s3: db 'this is s3','$' s4: db 'this is s4','$' s: dw offset s1, offset s2, offset s3, offset s4 row: db 2,4,6,8 start: mov ax,cs mov ds,ax mov bx,offset s mov si,offset row mov cx,4 show: ;int 10h,ah=2 放置光标 mov bh,0 mov dh,[si] mov dl,0 mov ah,2 int 10h ;int 21h,ah=9 在光标位置显示字符串 mov dx,[bx] mov ah,9 int 21h inc si add bx,2 loop show mov ax,4c00h int 21h code ends end start
在win 10 dosbox环境下的运行结果:



