程序如下:
assume cs:code
code segment
start: mov ax,code
mov ds,ax
mov si,offset s
mov ax,0
mov es,ax
mov di,200h
mov cx,offset send-offset s
cld
rep movsw
;以上为复制中断例程到0:200h
mov bx,7ch*4
mov es:[bx],word ptr 200h
mov es:[bx+2],word ptr 0
;以上为安装中断例程入口地址
mov ax,4c00h
int 21h
s: push ax
push bx
push cx
push dx
push es
push si
mov ax,0b800h
mov es,ax
mov al,160
dec dh
mul dh
mov bx,ax
mov al,2
dec dl
mul dl
add bx,ax
;由行号列号计算出地址
mov al,cl
;将颜色存入al(后面判断是否结束循环,需要用到cl)
xor cx,cx
next: mov cl,[si]
;取得一个字符
jcxz over
;如果是0,则转到over,结束
mov es:[bx],cl
;向显存写字符
mov es:[bx+1],al
;向显存写颜色
add bx,2
inc si
;修改地址指针
jmp next
over: pop si
pop es
pop dx
pop bx
pop cx
pop ax
iret
send: nop
code ends
end start
安装中断例程后,调试教材上的应用举例如下:
D:\masm>debug shy13_1t.exe
-u0 13
0B62:0000 B60A MOV DH,0A
0B62:0002 B20A MOV DL,0A
0B62:0004 B102 MOV CL,02
0B62:0006 B8600B MOV AX,0B60
0B62:0009 8ED8 MOV DS,AX
0B62:000B BE0000 MOV SI,0000
0B62:000E CD7C INT 7C
0B62:0010 B8004C MOV AX,4C00
0B62:0013 CD21 INT 21
-g b
AX=0B60 BX=0000 CX=0002 DX=0A0A SP=0000 BP=0000 SI=0000 DI=0000
DS=0B60 ES=0B50 SS=0B60 CS=0B62 IP=000B NV UP EI PL NZ NA PO NC
0B62:000B BE0000 MOV SI,0000
-t
AX=0B60 BX=0000 CX=0002 DX=0A0A SP=0000 BP=0000 SI=0000 DI=0000
DS=0B60 ES=0B50 SS=0B60 CS=0B62 IP=000E NV UP EI PL NZ NA PO NC
0B62:000E CD7C INT 7C
-d ss:fff0
0B60:FFF0 50 0B 0A 0A 02 00 60 0B-00 00 0E 00 62 0B 64 05 P.....`.....b.d.
-t
AX=0B60 BX=0000 CX=0002 DX=0A0A SP=FFFA BP=0000 SI=0000 DI=0000
DS=0B60 ES=0B50 SS=0B60 CS=0000 IP=0200 NV UP DI PL NZ NA PO NC
0000:0200 50 PUSH AX
-d ss:fff0
0B60:FFF0 50 0B 0A 0A 02 00 60 0B-00 00 10 00 62 0B 02 32 P.....`.....b..2
-u
0000:0200 50 PUSH AX
0000:0201 53 PUSH BX
0000:0202 51 PUSH CX
0000:0203 52 PUSH DX
0000:0204 06 PUSH ES
0000:0205 56 PUSH SI
0000:0206 B800B8 MOV AX,B800
0000:0209 8EC0 MOV ES,AX
0000:020B B0A0 MOV AL,A0
0000:020D FECE DEC DH
0000:020F F6E6 MUL DH
0000:0211 8BD8 MOV BX,AX
0000:0213 B002 MOV AL,02
0000:0215 FECA DEC DL
0000:0217 F6E2 MUL DL
0000:0219 03D8 ADD BX,AX
0000:021B 8AC1 MOV AL,CL
0000:021D 33C9 XOR CX,CX
0000:021F 8A0C MOV CL,[SI]
-u
0000:0221 E30D JCXZ 0230
0000:0223 26 ES:
0000:0224 880F MOV [BX],CL
0000:0226 26 ES:
0000:0227 884701 MOV [BX+01],AL
0000:022A 83C302 ADD BX,+02
0000:022D 46 INC SI
0000:022E EBEF JMP 021F
0000:0230 5E POP SI
0000:0231 07 POP ES
0000:0232 5A POP DX
0000:0233 5B POP BX
0000:0234 59 POP CX
0000:0235 58 POP AX
0000:0236 CF IRET
0000:0237 90 NOP
0000:0238 0000 ADD [BX+SI],AL
0000:023A 0000 ADD [BX+SI],AL
0000:023C 0000 ADD [BX+SI],AL
0000:023E 0000 ADD [BX+SI],AL
0000:0240 0000 ADD [BX+SI],AL
-g 235
AX=0002 BX=0002 CX=0000 DX=0A0A SP=FFF8 BP=0000 SI=0000 DI=0000
DS=0B60 ES=0B50 SS=0B60 CS=0000 IP=0235 NV UP DI PL NZ AC PO NC
0000:0235 58 POP AX
注:此时,在屏幕的10行10列显示了绿色的字符串。
-t
AX=0B60 BX=0002 CX=0000 DX=0A0A SP=FFFA BP=0000 SI=0000 DI=0000
DS=0B60 ES=0B50 SS=0B60 CS=0000 IP=0236 NV UP DI PL NZ AC PO NC
0000:0236 CF IRET
-d ss:fff0
0B60:FFF0 60 0B 00 00 36 02 00 00-64 05 10 00 62 0B 02 32 `...6...d...b..2
-t
AX=0B60 BX=0002 CX=0000 DX=0A0A SP=0000 BP=0000 SI=0000 DI=0000
DS=0B60 ES=0B50 SS=0B60 CS=0B62 IP=0010 NV UP EI PL NZ NA PO NC
0B62:0010 B8004C MOV AX,4C00
-q
D:\masm>
我想说的是,为什么这个可以单步执行到中断例程中?int指令也会把tf清0
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50