• 中断调用与子程序设计实验


    dos中断的指令:int
    中断处理程序入口程序CS:IP
    中断号*4 例:int 21h 21h*4=84h (低字存放IP,高字存放CS)
    则中断指令的入口地址 IP存放0084h,0085h
    入口地址CS存放0086H 0087H
    中断调用 INT 21H
    DOS中断调用步骤
    第一步:置入口参数
    第二步:功能号送AH
    第三步:执行 INT 21H
    (1)1号功能 键盘输入
    格式:MOV AH, 1
    INT 21H
    功能:接收键盘输入1个字符,保存在AL寄存器中。
    (2)2号功能 屏幕输出
    格式:
    MOV DL, 输出字符的ASCII
    MOV AH,2
    INT 21H
    (3)5号功能 打印机输出
    格式:MOV DL, 输出字符的ASCII
    MOV AH,5
    INT 21H
    (4)9号功能 屏幕输出字符串
    格式:LEA DX, 字符串变量名
    MOV AH,9
    INT 21H
    功能:屏幕显示一串字符
    (5)10号功能(0AH号)从键盘输入一串籽符串保存在变量缓冲区中
    格式:LEA DX, 字符串变量名
    MOV AH,10
    INT 21H
    (6)4CH号功能 程序结束返回DOS
    格式:MOV AH,4CH
    INT 21H
    实验1: 从键输入一串字符“I am student. ”,屏幕显示回车换行后,输出该串字符。

    Data  segment
    A  db  20, 0, 20 dup('$')
    Data  ends
    Code segment
    Assume  cs:code, ds:data
    Start:mov ax,data
    Mov ds,ax
    Lea dx,a  
    Mov ah,  10 
    Int 21h
    Mov dl,0dh  
    Mov ah,2
    Int 21h
    Mov dl,0ah   
    Mov ah,2
    Int 21h
    Lea  dx, a+2  
    Mov  ah,9
    Int 21h
    Mov ah, 4ch
    Int  21h
    Code ends
        End  start
    

    (2) BIOS 中断调用(略)P116
    (3)8086段内调用子程序设计实验
    子程序调用格式: CALL 子程序名
    子程序返回语句: RET
    实验2: 主程序显示字符串‘ABC’,主程序调用子程序sub1,子程序sub1的功能是显示字符‘X’(段内调用),本例中主程序与子程序在同一段中

    data segment
    a db 'ABC$'
    data ends
    code segment 
    assume cs:code,ds:data
    start:mov ax,data
    mov ds,ax
    lea dx,A
    mov AH,9
    int 21h
    call sub1
    mov ah,4ch
    int 21h
    sub1 proc
    mov dl,'X'
    mov ah,2
    int 21h
    ret
    sub1 endp
    code ends
    end start
    

    实验3:主程序main.asm段间(主程序与子程序以不同文件名存于磁盘中)调用子程序sub1.asm实验步骤
    主程序运行结果为’ABC’,子程序运行结果为‘X’。

    EXTRN  SUB1:FAR
    DATA  SEGMENT
    A  DB 'ABC$'
    DATA  ENDS
    STACK  SEGMENT  PARA  STACK 'STACK'
    DW 100 DUP(?)
    STACK  ENDS
    CODE SEGMENT
    ASSUME CS:CODE,SS:STACK
    START:MOV AX,DATA
            MOV DS,AX
            LEA  DX, A
            MOV AH,9
            INT 21H
            CALL  SUB1
            MOV AH,4CH
            INT 21H
           CODE  ENDS
                  END  START
    
    PUBLIC  SUB1
    CODE  SEGMENT
    SUB1 PROC  FAR
    ASSUME  CS:CODE
      ST1:MOV DL,'X'
           MOV AH,2
           INT 21H
           RET
     SUB1  ENDP
    CODE ENDS
          END ST1
    

    执行的指令如下:
    先汇编main.asm和sub1.asm文件
    在分别连接main.obj和sub1.obj文件
    最后运行main.exe可执行文件即可。
    实验4:
    将main和sub1程序清单放在同一个文件里面,使用段间调用来实现主程序调用子程序=_=

    code1 segment                   
          assume cs:code1
          main  proc   far           
               push dx
               mov ax,0
               push ax
               mov dl,'A'           
               mov ah, 2
                int 21h
                call  far  ptr  sub1  
                ret
    main endp                      
    code1  ends                     
    code2 segment                    
          assume cs:code2
          sub1  proc  far            
          push ds
          xor ax,ax
          push ax
          mov dl,'B'                  
          mov ah,2
          int 21h
          ret
          sub1  endp                 
    code2 ends
    end      
    
  • 相关阅读:
    5.MFC基础(五)视图、运行时类信息、动态创建
    4.MFC基础(四)菜单、工具栏、状态栏
    OpenCV Python 4.0安装
    windows批量导出文件名到txt
    *&p理解
    VS调试快捷键配置更改
    数组类的创建(下)
    数组类的创建(上)
    operator用法:隐式类型转换
    C++单例模式
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580114.html
Copyright © 2020-2023  润新知