实验八
验证程序能否正常返回
assume cs:code code segment mov ax,4c00h int 21h start: mov ax,0 ; ip=0005,程序入口点, s: nop ; ip:0008 nop mov di,offset s ; di=0008 mov si,offset s2 ; si=0020 mov ax,cs:[si] ; ax=[0020]=EBF6 mov cs:[di],ax ; [0008]=EBF6 s0:jmp short s s1:mov ax,0 int 21h mov ax,0 s2:jmp short s1 ;ip:0020 机器码EBF6,F6为-10的补码 nop code ends end start
程序运行到ip为0014时,将ip为0008,0009的nop指令改为机器码EBF6,接着jmp到0008处
此时0008处指令EBF6为跳转到前10个内存单元,先进行指令下移ip+2,当前ip为8+2,在进行跳转指令,跳转到内存空间为0处执行指令:
mov ax,4c00h int 21h
此时程序正常退出。
实验九
在屏幕中间用3种颜色属性打印三行welcome to masm!
;80*25的意思: 25行,每行80个字符 assume cs:code data segment db 'welcome to masm!' db 02h,24h,71h ; 要求的三个颜色对应的16进制代码 data ends stack segment db 16 dup (0) ; 定义16字节的栈段 stack ends code segment start: mov ax,0b800h mov es,ax ; 定义显示缓冲区段 mov ax,stack mov ss,ax ; 定义栈段(存储临时变量) mov ax,data mov ds,ax ; 定义数据段 mov bx,780h ; 780/160=12行(打印的位置) mov di,10h ; di为颜色的偏移 mov cx,3 ; 打印3行 mov sp,10h ; 初始栈 s: push cx mov ss:[10h],0 mov bp,0 ; bp为字符串的偏移地址 mov ah,[di] ; 高8位存颜色 mov si,0 ; si为显示缓冲区的偏移 mov cx,16 s1: mov al,ds:[bp] ; 低8位存字符 mov es:[bx+si+64],ax ; 显示缓冲区赋值 add bp,1 ; 字符串转到下一个字符 add si,2 ; 缓冲区移到下一个字符 loop s1 pop cx inc di ; 切换下一个颜色 add bx,0a0h ; 切换到下一行 loop s mov ax,4c00h int 21h code ends end start
需要在DOS界面才能打印