汇编语言实验13

(1)

assume cs:code
data segment
	db 'welcome to masm! ',0
data ends
code segment
start:
	
	;设置ds:[si]指向源地址,即cs:[do0]
    mov ax,cs
    mov ds,ax
    mov si,offset do7c

    ;设置es:[di]目的地址
    mov ax,0
    mov es,ax
    mov di,200h

    ;设置cx为传输长度
    mov cx,offset do7c_end-offset do7c
    cld                                 ;设置传输方向为正
    rep movsb

    ;设置7c中断向量表指向0:200h
    mov word ptr es:[7ch*4],200h
    mov word ptr es:[7ch*4+2],0
	;测试数据,dh=行号,dl=列号,cl=颜色
    
    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

	do7c:
		push ax
		push si
		push es
		push di
		push dx
		push cx
	;es:di指向输出缓存区,di=ah*16+dl*2
		mov ax,0b800h
		mov es,ax
		mov al,0A0h
		mul dh
		mov di,ax
		mov al,2
		mul dl
		add di,ax
	;放置数据
	show:
		mov al,ds:[si]
		cmp al,0
		je ok
		mov es:[di],al
		inc si
		inc di
		mov es:[di],cl
		inc di
		jmp short show

	ok:	
		pop cx
		pop dx
		pop di
		pop es
		pop si
		pop ax

		iret

	do7c_end: nop  ;代码段结尾,便于计算7ch例程的长度

code ends
end start

(2)

assume cs:code

code segment

start:      ;7cH中断例程的安装程序

            mov ax, cs

            mov ds, ax

            mov si, offset lp   ;将ds:si指向源地址(captial的机器码)

            mov ax, 0000H

            mov es, ax

            mov di, 200H        ;将es:di指向目的地址(0:200H向量表中)

            mov cx, offset lpend - offset lp    ;设置传输长度

            cld             ;传输方向为正

            rep movsb       ;字节传输

            ;设置中断向量表,使7cH条目中断向量指向0000:200H

            mov ax, 0000H

            mov es, ax

            mov word ptr es:[7cH*4], 200H

            mov word ptr es:[7cH*4+2], 0000H

           

            mov ax, 4c00H

            int 21H


lp:        push bp         ;将bp这个ss栈的偏址保存

            mov bp, sp      ;将当前栈顶指针值送入到bp

            dec cx          ;调用一次7cH,(cx)-1

            jcxz lpret      ;与(cx)值判断,如果为0,跳转到lpret标号

            add [bp+2], bx  ;修改ss栈中的从栈顶向下第2个单元的值

lpret:      pop bp          ;恢复bp值

            iret            ;返回到调用处。  

   

lpend:  nop             ;代码段结尾,便于计算7cH例程的长度。   

code ends

end start

(3)

;编程,分别在屏幕的2,4,6,8行显示4句英文诗
assume cs:code
code 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]		;dh放置行号
       mov dl,10		;dl放置列号
       mov ah,2		;调用10h号中断例程的二号子例程
       int 10h

       mov dx, [bx]	;dx中存放偏移地址
       mov ah,9		;调用21h号中断例程的9号子例程
       int 21h
       inc si			;准备下一次循环
       add bx,2
       loop ok
       mov ax,4c00h
       int 21h
 code ends
 end start
原创文章 182 获赞 29 访问量 2万+

猜你喜欢

转载自blog.csdn.net/treblez/article/details/105762690