目录 上一页 下一页 下一章

-286- PC机汇编语言实战精解




bin8o

crlf





crlf
code

loop
pop
ret
endp

proc
mov
int
mov
int
ret
endp
ends
end
loop4
cx



near
ax,0e0dh
10h
al,0ah
10h



main
;转LOOP4继续处理下一数位
;恢复CX寄存器
;返回主过程


;输出回车、换行符的子程序
;利用10H中断的0EH功能输出回车符

;输出换行符

;返回主过程



  这段程序所完成的是64位逻辑右移,所用的一点技巧就是在处理第一个字节之前先用CLC指令将CF标志清零,这使得移位后最左端的数位是0,而不是什么未知的结果。如果想完成64位算术移位也很简单,可以考虑在处理第一个字节之前先把它的符号位送进CF标志就可以了。程序的修改很简单,只要去掉CLC指令改用它下面两条加有";"的指令即可。
  (5)中断指令
  除了条件转移指令之外,还有几个指令在执行时也要判断条件,比如刚刚讨论过的LOOPZ/LOOPNZ,以及前面学习过的指令前缀REPZ/REPNZ等。其实,中断指令也有一条是需要判断条件的,当然,我们前面学习过的指令INT并没有这样的要求,这是一条新的指令:
助记符:INTO(Interrupt if Overflow)
用 途:如果发生溢出则执行中断
格 式:INTO
执 行:执行INTO指令时,CPU首先判断OF标志位,如果OF=1,则CPU自动
    执行4号中断服务程序;如果OF=0,则CPU继续执行下面的程序
  如果不考虑此指令判断的条件,则可以用"INT 04"代替这条指令。这条指令很不常用,不过在一些加密软件中有时会常见它的身影。需要提到的是这条指令产生的中断也是处理机中断。实际上处理机中断有些也是需要指令才能产生的,这一点与前面我们讨论过的除法错中断、单步中断不同。除法错、单步中断是在CPU执行指令时自动产生,而溢出中断则不同,如果CPU没有执行INTO指令,即使运算发生溢出它也不会自动转去执行4号中断服务程序。
  还有一条中断指令也很特殊,这条指令就是"INT 3"。从形式上看这条指令与"INT 10H"、"INT 21H"没有什么区别,但是它编译之后的机器码却与一般的INT指令有很大的不同。那么不同之处在哪里?这个问题咱们可以请教DEBUG:
  C:\ASM\>DEBUG[Enter]
  -a[Enter]
  0F6A:0100 mov ax,0e07
  0F6A:0103 int 10

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章