转移指令实验

实验八

验证程序能否正常返回

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界面才能打印

 

原文地址:https://www.cnblogs.com/luocodes/p/11942599.html