• 转移指令实验


    实验八

    验证程序能否正常返回

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

     

  • 相关阅读:
    函数的进阶
    几个基础 类型循环删除
    函数的初识
    python3的 基础
    python3 最基础
    demo
    [转] ajax方法
    <codis><jodis>
    <Redis Advance><Pipelining><Memory Optimization><Expire><Transactions>
    <HBase><Scan>
  • 原文地址:https://www.cnblogs.com/luocodes/p/11942599.html
Copyright © 2020-2023  润新知