• 【8086汇编基础】04中断


    8086汇编语言初学者教程(第四部分) 

    中断 
     

    中断是一系列功能调用。这些功能调用使得编程更加容易。

    比如,你想在打印机上输出一个字符,你只需要简单的调用

    中断,它将帮你完成所有的事情。另外还有控制磁盘和其他

    硬件工作的中断。我们将这些功能调用称作软件中断。

    不同的硬件同样可以触发中断,这些中断称作硬件中断。这里

    我们只介绍软件中断(
    software interrupts)。
     

    触发一个软件中断,需要使用INT指令,它的使用方式非常简单
     

    INT value


    上面value的取值范围是从 0  255 (或者0到0ffh),通常我们

    使用十六进制。

    你也许猜测只有256个中断调用,但是这是不正确的。因为每一

    个中断都有子功能。

    在调用一个中断的子功能之前,需要设置AH寄存器。


    每一个中断最多可以拥有256个子功能(于是,我们有

    256*256=65536个功能调用)。一般情况下使用AH寄存器,但是

    一些情况下可能使用另外的寄存器。通常,其他的寄存器

    是用来传递数据和参数的。

    下面的例子调用了 INT 10h中断0Eh子功能输出字符串‘Hello!'。

    这个功能作用是在屏幕上显示一个字符,然后光标进一,如果

    需要还滚屏。
     

    #MAKE_COM# ; 生成com文件的指令
    ORG 100h
    ;我们使用的这个子功能没有返回值,
    ;所以我们只用设置就可以了。
    
    MOV AH, 0Eh ; 选择子功能
    ;int 10h/0eh 子功能,输出放在
    ;AL寄存器中的ASCII码对应的字符
    
    MOV AL, 'H' ; ASCII码: 72
    INT 10h ; 输出
    
    MOV AL, 'e' ; ASCII 码: 101
    INT 10h ; 输出
    
    MOV AL, 'l' ; ASCII 码: 108
    INT 10h ; 输出
    
    MOV AL, 'l' ; ASCII 码: 108
    INT 10h ; 输出
    
    MOV AL, 'o' ; ASCII 码: 111
    INT 10h ; 输出
    
    MOV AL, '!' ; ASCII 码: 33
    INT 10h ; 输出
    
    RET ; 返回操作系统


    将上述程序拷贝粘贴到Emu8086代码编辑器,点击

    [Compile and Emulate] 按钮,运行!

      关于中断更多的知识,请查阅下面的英文文档:

    Interrupts currently supported by emulator



    Quick reference:

    INT 10h/00h
    INT 10h/01h
    INT 10h/02h
    INT 10h/03h
    INT 10h/05h
    INT 10h/06h
    INT 10h/07h
    INT 10h/08h
    INT 10h/09h
    INT 10h/0Ah
    INT 10h/0Eh
    INT 10h/13h
    INT 10h/1003h
    INT 11h
    INT 12h
    INT 13h/00h
    INT 13h/02h
    INT 13h/03h
    INT 15h/86h
    INT 16h/00h
    INT 16h/01h
    INT 19h
    INT 1Ah/00h
    INT 21h





    A list of supported interrupts with descriptions:

     


    INT 10h / AH = 00h - set video mode.

    input:
    AL = desired video mode.

    These video modes are supported:

    00h - Text mode 40x25, 16 colors, 8 pages.

    03h - Text mode 80x25, 16 colors, 8 pages.

     


    INT 10h / AH = 01h - set text-mode cursor shape.

    input:
    CH = cursor start line (bits 0-4) and options (bits 5-7).
    CL = bottom cursor line (bits 0-4).

    When bits 6-5 of CH are set to 00, the cursor is visible, to hide a cursor set these bits to 01 (this CH value will hide a cursor: 28h - 00101000b). Bit 7 should always be zero.

     


    INT 10h / AH = 02h - set cursor position.

    input:
    DH = row.
    DL = column.
    BH = page number (0..7).

     


    INT 10h / AH = 03h - get cursor position and size.

    input:
    BH = page number.
    return:
    DH = row.
    DL = column.
    CH = cursor start line.
    CL = cursor bottom line.

     


    INT 10h / AH = 05h - select active video page.

    input:
    AL = new page number (0..7).
    the activated page is displayed.

       


    INT 10h / AH = 06h - scroll up window.
    INT 10h / AH = 07h - scroll down window.

    input:
    AL = number of lines by which to scroll (00h = clear entire window).
    BH = attribute used to write blank lines at bottom of window.
    CH, CL = row, column of window's upper left corner.
    DH, DL = row, column of window's lower right corner.

     


    INT 10h / AH = 08h - read character and attribute at cursor position.

    input:
    BH = page number.
    return:
    AH = attribute.
    AL = character.

     


    INT 10h / AH = 09h - write character and attribute at cursor position.

    input:
    AL = character to display.
    BH = page number.
    BL = attribute.
    CX = number of times to write character.

     


    INT 10h / AH = 0Ah - write character only at cursor position.

    input:
    AL = character to display.
    BH = page number.
    CX = number of times to write character.

     


    INT 10h / AH = 0Eh - teletype output.

    input:
    AL = character to write.

    This functions displays a character on the screen, advancing the cursor and scrolling the screen as necessary. The printing is always done to current active page. 

     


    INT 10h / AH = 13h - write string.

    input:
    AL = write mode:
        bit 0: update cursor after writing;
        bit 1: string contains attributes.
    BH = page number.
    BL = attribute if string contains only characters (bit 1 of AL is zero).
    CX = number of characters in string (attributes are not counted).
    DL,DH = column, row at which to start writing.
    ES:BP points to string to be printed.


     


    INT 10h / AX = 1003h - toggle intensity/blinking.

    input:
    BL = write mode:
        0: enable intensive colors.
        1: enable blinking (not supported by emulator!).
    BH = 0 (to avoid problems on some adapters).

     
    Bit color table:
    Character attribute is 8 bit value, low 4 bits set foreground color, high 4 bits set background color. Background blinking not supported.

    
    HEX    BIN        COLOR
    
    0      0000      black
    1      0001      blue
    2      0010      green
    3      0011      cyan
    4      0100      red
    5      0101      magenta
    6      0110      brown
    7      0111      light gray
    8      1000      dark gray
    9      1001      light blue
    A      1010      light green
    B      1011      light cyan
    C      1100      light red
    D      1101      light magenta
    E      1110      yellow
    F      1111      white
    

     



    INT 11h - get BIOS equipment list.

    return:
    AX = BIOS equipment list word, actually this call returns the contents of the word at 0040h:0010h.

    Currently this function can be used to determine the number of installed number of floppy disk drives.
    
    Bit fields for BIOS-detected installed hardware:
    Bit(s)	Description
     15-14  number of parallel devices.
     13     not supported.
     12     game port installed.
     11-9   number of serial devices.
     8      reserved.
     7-6    number of floppy disk drives (minus 1):
              00 single floppy disk;
              01 two floppy disks;
              10 three floppy disks;
              11 four floppy disks.
     5-4    initial video mode:
              00 EGA,VGA,PGA, or other with on-board video BIOS;
              01 40x25 CGA color;
              10 80x25 CGA color (emulator default);
              11 80x25 mono text.
     3    not supported.
     2    not supported.
     1    math coprocessor installed.
     0    set when booted from floppy (always set by emulator).
    

     



    INT 12h - get memory size.

    return:
    AX = kilobytes of contiguous memory starting at absolute address 00000h, this call returns the contents of the word at 0040h:0013h.


    Floppy drives are emulated using FLOPPY_0(..3) files. 

     



    INT 13h / AH = 00h - reset disk system, (currently this call doesn't do anything). 

       



    INT 13h / AH = 02h - read disk sectors into memory.
    INT 13h / AH = 03h - write disk sectors.

    input:
    AL = number of sectors to read/write (must be nonzero)
    CH = cylinder number (0..79).
    CL = sector number (1..18).
    DH = head number (0..1).
    DL = drive number (0..3 , depends on quantity of FLOPPY_? files).
    ES:BX points to data buffer.
    return:
    CF set on error.
    CF clear if successful.
    AH = status (0 - if successful).
    AL = number of sectors transferred. 
    Note: each sector has 512 bytes.

     



    INT 15h / AH = 86h - BIOS wait function.

    input:
    CX:DX = interval in microseconds
    return:
    CF clear if successful (wait interval elapsed),
    CF set on error or when wait function is already in progress.

    Note:
    the resolution of the wait period is 977 microseconds on many systems, Emu8086 uses 1000 microseconds period.


     



    INT 16h / AH = 00h - get keystroke from keyboard (no echo).

    return:
    AH = BIOS scan code.
    AL = ASCII character.
    (if a keystroke is present, it is removed from the keyboard buffer).

     



    INT 16h / AH = 01h - check for keystroke in keyboard buffer.

    return:
    ZF = 1 if keystroke is not available.
    ZF = 0 if keystroke available.
    AH = BIOS scan code.
    AL = ASCII character.
    (if a keystroke is present, it is not removed from the keyboard buffer).

     



    INT 19h - system reboot.

    Usually, the BIOS will try to read sector 1, head 0, track 0 from drive A: to 0000h:7C00h. Emulator just stops the execution, to boot from floppy drive select from the menu: 'Virtual Drive' -> 'Boot from Floppy'

     



    INT 1Ah / AH = 00h - get system time.

    return:
    CX:DX = number of clock ticks since midnight.
    AL = midnight counter, advanced each time midnight passes.

    Notes:
    There are approximately 18.20648 clock ticks per second,
    and 1800B0h per 24 hours. 
    AL is not set by emulator yet!  




    MS-DOS can not be loaded completely in emulator yet, so I made an emulation for some basic DOS interrupts also:

    INT 20h - exit to operating system.

    INT 21h / AH=09h - output of a string at DS:DX.

    INT 21h / AH=0Ah - input of a string to DS:DX, fist byte is buffer size, second byte is number of chars actually read.

    INT 21h / AH=4Ch - exit to operating system.

    INT 21h / AH=01h - read character from standard input, with echo, result is stored in AL.

    INT 21h / AH=02h - write character to standard output, DL = character to write, after execution AL = DL.

     

    <<< 上一部分 <<<【8086汇编基础】03--变量、数组和常量的处理

    >>> 下一部分 >>>【8086汇编基础】05--常用函数库文件--emu8086.inc

     

    作者:逸云沙鸥
    出处:http://www.cnblogs.com/QuLory/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    软件部门每年耗资大约100亿到200多亿美元,但没有研发出任何具有说服力的产品,因此华为决定关闭
    Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good
    linux 下用find命令查找文件,rm命令删除文件
    北电之死:谁谋杀了华为的对手?——银湖资本(Silver Lake)董事总经理爱德华·詹德出任CEO,既不了解华为,也不重视中国,直截了当地否决了收购华为
    搞定JavaScript正则表达式
    Orleans3.0
    CSS盒模型
    作用域和闭包
    NServiceBus是.Net平台下的开源的消息服务框架
    [1]System.Reflection.Emit
  • 原文地址:https://www.cnblogs.com/QuLory/p/2758054.html
Copyright © 2020-2023  润新知