![]() | 第3章 中断调用与子程序 | -43- | |||||||||||||||||||
为什么会有这样的区别,在本书的后面会有更详细的介绍。 | |||||||||||||||||||||
PROG5是由PROG3-B演变而来,去掉了INT 20指令,而用JMP指令转移至CS:0处去执行那里的"INT 20"。 这里采用了JMP指令的新用法,程序先将"0"放入AX,用"JMP AX"转移到CS:0。如果我们把"JMP 00"看作"立即数寻址"方式,那么可以说"JMP AX"应用的就是"寄存器寻址"方式。可见转移指令JMP和MOV、INC一样有不同的寻址方式。现在来跟踪一下JMP指令的执行: |
|||||||||||||||||||||
-g=100 11b | |||||||||||||||||||||
Hello,World! | |||||||||||||||||||||
AX=0000 | BX=0000 | CX=001D | DX=0102 | SP=FFFE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0A3E | ES=0A3E | SS=0A3E | CS=0A3E | IP=011B | NV UP EI PL NZ NA PO NC | ||||||||||||||||
0A3E:011B | FFE0 | JMP AX | |||||||||||||||||||
-t | |||||||||||||||||||||
AX=0000 | BX=0000 | CX=001D | DX=0102 | SP=FFFE | BP=0000 | SI=0000 | DI=0000 | ||||||||||||||
DS=0A3E | ES=0A3E | SS=0A3E | CS=0A3E | IP=0000 | NV UP EI PL NZ NA PO NC | ||||||||||||||||
0A3E:0000 | CD20 | INT 20 | |||||||||||||||||||
PROG5-A中应用"直接寻址"方式,PROG5-B中则是应用了"寄存器间接寻址"方式。请大家注意"FFFE"这个数据,它实际应与SP寄存器的初值相同。如果进入DEBUG之后发现SP的值是FFEE或其它的,则应将方括号中的数据修改成与SP寄存器相同的值。 所有这些寻址方式同样适于CALL指令。 |
|||||||||||||||||||||
PROG5-A -A100[Enter] 0A3E:0100 JMP 111 0A3E:0102 DB'Hello,World!',0D,0A,24 0A3E:0111 MOV DX,0102 0A3E:0114 MOV AH,09 0A3E:0116 INT 21 0A3E:0118 JMP [FFFE] 0A3E:011C PROG5-B -A100[Enter] ;偏移0100-0116与PROG5-A相同 0A3E:0118 MOV BX,FFFE 0A3E:011B JMP BX | |||||||||||||||||||||
最后来谈一谈编制子程序时一个至关重要的问题。子程序运行时必然也要用到寄存器或内存中的数据,在使用寄存器中的数据时务必要注意一点,那就是主程序在调用这个子程序后还要使用的数据不能被子程序修改。 仔细分析PROG4-A,可以发觉若要保证执行主程序中的CMP指令时AL寄存器中确实是我们所 |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |