《汇编语言(第3版)》王爽 第十三章实验

来源:互联网 发布:python自动化运维系统 编辑:程序博客网 时间:2024/05/23 12:16

1、编写int 7ch中断例程,功能显示一个0结束的字符串,中断例程安装在0:200处

;功能:调用7ch中断例程,显示0结束的字符串assume cs:codedata segment        db "Welcome to masm!",0data endscode 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 21hcode endsend start

;功能:安装7ch中断例程到0:200处;7ch中断例程作用,显示一个0结束的字符串。;思路:要先复制中断程序到相应内存中,再把中断程序的地址写到中断向量表中assume cs:code,ss:stackstack segment        dw 8 dup (0)stack endscode segment        start:;利用movsb指令复制程序                mov ax,cs;movsb使用前先设置好源地址ds:si,                mov ds,ax                mov si,offset cpstart                mov ax,0;目标地址es:[di],                mov es,ax                mov di,200h                mov cx,offset cpend - offset cpstart;复制长度,                cld;复制方向,                rep movsb;循环复制。;绑定中断向量表                mov ax,200h                mov word ptr es:[7ch*4],ax;在7ch*4处写入偏移地址                mov word ptr es:[7ch*4+2],0;在7ch*4+2写入段地址                mov ax,4c00h                int 21h      cpstart:;显示0结束字符串的中断例程                dec dh;现把给定行号dh,列号dl转化成首地址                mov al,dh;思路:(dh-1)x 160 + (dl-1) x 2                mov bl,160                mul bl                mov dh,0                dec dl                add ax,dx                add ax,dx                mov bx,ax;把转化结果暂存在bx中                mov ax,0b800h;把字符串显示在屏幕中                mov es,ax                mov di,bx            s:  cmp byte ptr [si],0h                je ok                mov al,[si]                mov es:[di],al                mov es:[di+1],cl                inc si                add di,2                jmp short s           ok:  iret        cpend:  nopcode endsend start

2、编写并安装int 7ch中断例程,功能为完成loop指令的功能

;本程序为7ch调用程序,功能实现在屏幕显示80个!assume cs:codecode segment        start:;调用7ch实现loop的功能                mov ax,0b800h                mov es,ax                mov di,160*12                mov bx,offset s - offset se;loop指令跳转偏移量                mov cx,80;loop指令循环次数            s:  mov byte ptr es:[di],'!'                add di,2                int 7ch           se:  nop                mov ax,4c00h                int 21hcode endsend start

;功能:用int7ch中断例程实现loop指令的功能;思路:loop指令实现跳转必须知道循环次数、偏移量;其次loop中cx是需要每次减少的assume cs:code,ss:stackstack segment        dw 8 dup (0)stack endscode segment        start:;7ch中断安装程序                mov ax,cs                mov ds,ax                mov si,offset cpstart                mov ax,0                mov es,ax                mov di,200h                mov cx,offset cpend - offset cpstart                cld                rep movsb                mov ax,200h                mov word ptr es:[7ch*4],ax                mov word ptr es:[7ch*4+2],0                mov ax,4c00h                int 21h      cpstart:;中断例程实现loop功能                dec cx;loop中的cx每次减少                jcxz ok                mov bp,sp;bp指令的段地址默认是在ss中                add [bp],bx;实现跳转的本质就是改变ip值           ok:  iret        cpend:  nopcode endsend start

3、在屏幕的2,4,6,8行显示4句英文诗

;功能:在屏幕的2,4,6,8行显示4句英文诗assume cs:codedata segment        db "Welcome to masm!",0data endscode segment        s1:     db 'Good,better,best,','$'        s2:     db 'Never let it rest,','$'        s3:     db 'Till good is better,','$'        s4:     db 'And better,best.','$'        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           ok:  mov bh,0                mov dh,[si]                mov dl,0                mov ah,2                int 10h                mov dx,[bx]                mov ah,9                int 21h                inc si                add bx,2                loop ok                mov ax,4c00h                int 21hcode endsend start



0 0