zoukankan      html  css  js  c++  java
  • 汇编学习笔记42

    三、DOS程序段前缀和特殊程序处理程序

    1.程序段前缀 PSP

    程序段前缀是DOS加载一个外部命令或应用程序时,在程序段之前设置的一个只有256字节的信息区

    当DOS把控制权转给外部命令或应用程序时,数据段寄存器DS和附加段寄存器ES均指向PSP,即均含有PSP的段值。

    这样应用程序可以方便地使用PSP的有关信息。

    2.终止程序的另一途径

    利用DOS的4CH号系统功能调用终止程序,把控制权转交到DOS,这是我们现在常用的方法,但早先常利用DOS提供的20H号中断处理程序来中断程序

    通过20H号中断处理程序终止程序有一个条件,即进入20H号程序之前,代码段寄存器CS必须含有PSP的段值。由于对EXE类型的应用程序而言,其代码段与PSP不是同一个段值,所以不能简单地直接利用指令INT 20H来终止程序

    在PSP的偏移0处,安排了一条INT 20H指令。其机器码为CD20, 于是应用程序只需要跳转到PSP的偏移0处,就能实现程序的终止。

    例:显示信息HELLO

    SSEG SEGMENT PARA STACK

    DW 256DUP(?)

    SSEG ENDS

    DSEG SEGMENT

    MESS DB 'HELLO', 0DH, 0AH, '$'

    DSEG ENDS

    CSEG SEGMENT

    ASSUME CS: CSEG, DS: DSEG

    MAIN PROC FAR

    START: PUSH DS

    XOR AX, AX

    PUSH AX

    MOV AX, DSEG

    MOV DS, AX

    MOV DX, OFFSET MESS

    MOV AH, 9

    INT 21H

    RET

    MAIN ENDP

    CSEG ENDS

    END START

    说明: RET后,PSP的段值和偏移送到CS和IP, CPU执行INT 20H,程序结束。

    3.应用程序取得命令行参数:

    DOS 加载一个外部命令或应用程序时,允许在被加载的程序之后,输入多达127个字符(包含最后的回车符)的参数。并把这些参数送到PSP格式化参数区。即PSP中从偏移80H开始的区域。应用程序可以从PSP中获得命令行参数。

    PSP的偏移80H处含命令行参数的长度(字节数),从PSP的偏移81H开始存放命令行参数

    命令行参数通常以空格符引导,以回车符结束。

    注意:命令行中的重定向符和管道符及有关信息不作为命令行参数送到PSP。

    例:

    写一个显示命令行参数的程序,先从PSP中把命令行参数传到程序定义的缓冲区中,然后再显示。

    ; 功能: 显示命令行参数

    CSEG SEGMENT

    ASSUME CS: CSEG, DS: CSEG

    BUFFER DB 128DUP(?)

    START: CLD

    MOV SI, 80H

    LODSB

    MOV CL, AL

    XOR CH, CH

    PUSH CS

    POP ES

    MOV DI, OFFSET BUFFER

    PUSH CX

    REP MOVSB

    POP CX

    PUSH ES

    POP DS

    MOV SI, OFFSET BUFFER

    MOV AH, 2

    JCXZ OVER

    NEXT: LODSB

    MOV DL, AL

    INT 21H

    LOOP NEXT

    OVER: MOV AX, 4C00H

    INT 21H

    CSEG ENDS

    END START

    二、 对CTRL+C和CTRL+BREAK的处理。

    1. CTRL+C的处理程序。

    例: 在屏幕上显示用户所按字符,直到用户按ESC键

    CR=0DH

    LF=0AH

    ESCAPE=1BH

    CSEG SEGMENT

    ASSUME CS: CSEG, DS: CSEG

    START: PUSH CS

    POP DS

    COUT: MOV AH, 8

    INT 21H

    CMP AL, ESCAPE

    JZ SHORT XIT

    MOV DL, AL

    MOV AH, 2

    INT 21H

    CMP DL, CR

    JNZ CONT

    MOV AH, 2

    INT 21H

    MOV DL, LF

    MOV AH, 2

    INT 21H

    JMP CONT

    XIT: MOV AH, 4CH

    INT 21H

    CSE ENDS

    END START

    当应用程序利用DOS功能调用进行字符输入输出时,DOS通常检测CTRL+C键。如果检测,那么DOS在遇到CTRL+C后,就先显示字符'C',并产生INT 23H中断,缺省的23H号中断处理程序中止程序的执行。

    DOS提供的这一功能便于用户随机地中止一个执行错误或不必必须执行的程序

    2.CTRL+BREAK的处理程序

    键盘中断处理程序(5号中断处理程序)发现CTRL+BREAK键被按下时,将产生INT 1BH中断,由DOS提供的1BH号中断处理程序将在约定的内存单元中设置一个标志,然后结束。DOS通过该标志检测CTRL+BREAK是否被按下。如果发现被按下时,则像处理CTRL+C那样显示'C'和产生INT 23H

    如果应用程序要自己处理CTRL+BREAK键,则可通过提供新的1BH中断处理程序的方法来实现。

    所以如果应用程序要使得CTRL+BREAK键不干扰程序运行,只需要使1BH号中断处理程序不设置与DOS约定的内存单元。

    但要注意,DOS并不自动保存和恢复1BH中断向量,所以如果应用程序要提供新的1BH中断处理程序, 那么在修改1BH号中断向量前,先要保存原1BH号中断向量,在程序结束前恢复它。

     

  • 相关阅读:
    程序员修炼之道:从小工到专家--读书摘录
    代码规范--捡拾(SQL语句)
    新博客,新生活
    如何用Eclipse+maven创建servlet 3.0 web 项目
    swift -- 枚举
    swift -- 函数
    控制语句 for while if switch
    swift -- 字符串
    swift -- 集合
    swift -- 字典
  • 原文地址:https://www.cnblogs.com/hailong/p/1935871.html
Copyright © 2011-2022 走看看