int

Tutorial: 汇编基础 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
1. 中断回顾
(1)取得中断类型码N;
(2)pushf
(3)TF=0, IF=0
(4)push CS
(5)push IP
(6)(IP)=(N*4), (CS)=(N*4+2)

iret
    pop ip
    pop cs
    popf
2. 在屏幕中间显示 80 个"!", 以中断程序的方式完成 loop 指令循环
assume cs:code,ss:stack,ds:data

data segment
         db 128 dup (0)
data ends

stack segment stack
          db 128 dup (0)
stack ends

code segment
    start:
                  mov  ax,stack
                  mov  ss,ax
                  mov  sp,128

                  call cpy_new_init0
                  call set_new_init0

                  int  0                                      ; 会执行 new_init0

                  mov  ax,4C00H
                  int  21H
    ; -------------------------------------
    set_new_init0:
                  mov  bx,0
                  mov  es,bx

                  cli                                         ; 清除标志位IF, 即设置为0(DI), 禁止中断发生
                  mov  word ptr es:[0*4],7E00H
                  mov  word ptr es:[0*4+2],0
                  sti                                         ; 设置标志位IF, 即设置为1(EI), 允许中断发生
                  ret
    ; -r
    ; AX=0E2C  BX=0000  CX=0000  DX=0000  SP=0080  BP=0000  SI=0049  DI=7E1E
    ; DS=0E34  ES=0000  SS=0E2C  CS=0E34  IP=000E   NV UP EI PL NZ NA PO NC
    ; 0E34:000E CD00          INT     00
    ; -u cs:2b
    ; 0E34:002B 53            PUSH    BX
    ; 0E34:002C 51            PUSH    CX
    ; 0E34:002D 52            PUSH    DX
    ; 0E34:002E 06            PUSH    ES
    ; 0E34:002F BB00B8        MOV     BX,B800
    ; 0E34:0032 8EC3          MOV     ES,BX
    ; 0E34:0034 BB0000        MOV     BX,0000
    ; 0E34:0037 B9D007        MOV     CX,07D0
    ; 0E34:003A B221          MOV     DL,21
    ; ...

    ; -d cs:2b 2F
    ; 0E34:0020                                   53 51 52 06 BB              SQR..
    ; 0E34:0030  00 B8 8E C3 BB 00 00 B9-D0 07 B2 21 26 88 17 83   ...........!&...

    ; -d es:7E00 F
    ; 0000:7E00  53 51 52 06 BB 00 B8 8E-C3 BB 00 00 B9 D0 07 B2   SQR.............

    ; -d 0:0 F
    ; 0000:0000  00 7E 00 00 BB 13 21 08-F4 00 70 00 B1 13 21 08   .~....!...p...!.

    ; -------------------------------------
    new_init0:
    ;                   先用这些测试
    ;                   mov  ax,1000H
    ;                   mov  ax,1000H
    ;                   mov  ax,1000H
    ;                   mov  ax,1000H
                  push bx
                  push cx
                  push dx
                  push es

                  mov  bx,0B800H
                  mov  es,bx

                  mov  bx,0
                  mov  cx,2000
                  mov  dl, '!'

    show_asc:
                  mov  es:[bx],dl
                  add  bx,2
                  loop show_asc

                  pop  es
                  pop  dx
                  pop  cx
                  pop  bx

                  iret
    ; -------------------------------------
    new_init0_end:
                  nop
    ; -------------------------------------
    cpy_new_init0:
                  mov  bx,cs
                  mov  ds,bx
                  mov  si,OFFSET new_init0

                  mov  bx,0
                  mov  es,bx
                  mov  di,7E00H

                  mov  cx,OFFSET new_init0_end - new_init0
                  cld                                         ; si++ di++  ds[si] => es[di]
                  rep  movsb

                  ret


code ends
end start
3. 编写、安装中断 7ch 的中断例程

功能:求一 word 型数据的平方 参数:(ax)= 要计算的数据 返回值:dx、ax 中存放结果的高 16 位和低 16 位 应用举例:求 2*3456^2

assume cs:code

code segment
    start:
                    call copy_new_int7ch              ; 复制到 0:200
                    call set_new_int7ch

                    mov  ax,3456
                    int  7ch
    ; AX=0D80  BX=0000  CX=0000  DX=0000  SP=0000  BP=0000  SI=0013  DI=0203
    ; DS=0E24  ES=0000  SS=0E23  CS=0E24  IP=0009   NV UP EI PL NZ NA PO NC
    ; 0E24:0009 CD7C          INT     7C
    ; -t

    ; AX=0D80  BX=0000  CX=0000  DX=0000  SP=FFFA  BP=0000  SI=0013  DI=0203
    ; DS=0E24  ES=0000  SS=0E23  CS=0000  IP=0200   NV UP DI PL NZ NA PO NC
    ; 0000:0200 F7E0          MUL     AX
    ; -t

    ; AX=4000  BX=0000  CX=0000  DX=00B6  SP=FFFA  BP=0000  SI=0013  DI=0203
    ; DS=0E24  ES=0000  SS=0E23  CS=0000  IP=0202   OV UP DI PL NZ NA PE CY
    ; 0000:0202 CF            IRET
    ; -t

    ; AX=4000  BX=0000  CX=0000  DX=00B6  SP=0000  BP=0000  SI=0013  DI=0203
    ; DS=0E24  ES=0000  SS=0E23  CS=0E24  IP=000B   NV UP EI PL NZ NA PO NC
    ; 0E24:000B B8004C        MOV     AX,4C00

                    mov  ax,4c00h
                    int  21h

    sqr:
                    mul  ax
                    iret

    sqr_end:
                    nop

    set_new_int7ch:
                    mov  ax,0
                    mov  es,ax

                    mov  word ptr es:[7ch*4], 200h
                    mov  word ptr es:[7ch*4+2], 0
    ; -d es:1F0
    ; 0000:01F0  00 02 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

                    ret

    copy_new_int7ch:
                    mov  ax,cs
                    mov  ds,ax
                    mov  si,offset sqr                ; 设置ds:si指向源地址

                    mov  ax,0
                    mov  es,ax
                    mov  di,200h                      ; 设置es:di指向目的地址

                    mov  cx,offset sqr_end -  sqr     ; 设置cx为传输长度
                    cld                               ; 设置传输方向为正
                    rep  movsb
    ; -u es:200
    ; 0000:0200 F7E0          MUL     AX
    ; 0000:0202 CF            IRET
    ; -d es:200
    ; 0000:0200  F7 E0 CF 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

                    ret

code ends
end start
4. 编写、安装中断 7ch 的中断例程

功能:将一个全是字母,以 0 结尾的字符串,转化为大写 参数:ds:si 指向字符串的首地址 应用举例:将 data 段中的字符串转化为大写

assume cs:code

data segment
         db 'conversation',0
data ends

code segment
    start:
                    call copy_new_int7ch                    ; 安装程序
                    call set_new_int7ch                     ; 设置程序入口

                    mov  ax,data
                    mov  ds,ax
                    mov  si,0

                    int  7ch                                ; 测试

                    mov  ax,4c00h
                    int  21h

    set_new_int7ch:
                    mov  ax,0
                    mov  es,ax

                    mov  word ptr es:[7ch*4], 200h
                    mov  word ptr es:[7ch*4+2], 0

                    ret

    copy_new_int7ch:
                    mov  ax,cs
                    mov  ds,ax
                    mov  si,offset capital                  ; 设置ds:si指向源地址

                    mov  ax,0
                    mov  es,ax
                    mov  di,200h                            ; 设置es:di指向目的地址

                    mov  cx,offset capital_end - capital    ; 设置cx为传输长度
                    cld                                     ; 设置传输方向为正
                    rep  movsb

                    ret

    capital:
                    push cx
                    push si

    change:
                    mov  cl,[si]
                    mov  ch,0
                    jcxz ok
                    and  byte ptr [si],11011111b
                    inc  si
                    jmp  short change

    ok:
                    pop  si
                    pop  cx

                    iret

    capital_end:
                    nop

code ends
end start