![]() | 第4章 奇妙的声音 | -61- | |||||||||||||||||||
MAIN CODE |
JNZ PLAY MOV AH,4CH INT 21H ENDP ENDS END MAIN |
;未结束,继续演奏下一个音符 ;选择DOS API的4CH功能 ;终止进程,返回DOS |
|||||||||||||||||||
程序中多了两个新的指令--CBW和SHL,同时还有一个新的伪指令──DW(Define Word)。这个伪指令的作用同DB类似,只不过它用来定义十六位数据,也就是一个"字"。 | |||||||||||||||||||||
![]() |
助记符:CBW(Convert Byte to Word) 用 途:将AL寄存器中的一字节数据转换成一个字,高八位扩展到AH中 格 式:CBW 执 行:AL的低7位状态不变,最高位被扩展成八位并存入AH寄存器中 |
||||||||||||||||||||
此指令用于将八位数据转换成十六位,而且数的大小不变。转换过程并不复杂:如果AL寄存器的最高位(bit7)为0,则AH寄存器就被置成00H;如果AL寄存器的最高位为1,那么AH寄存器就被置成0FFH。例如若AL为0FH,AH为01H,则执行CBW指令后AX寄存器将是000FH;若AL为0F0H,AH为01H,则执行CBW后AX寄存器将是0FFF0H。 "有没有搞错啊!0F0H和0FFF0H可能相等吗?" 先不要惊奇,粗看上去这两者并不一样,但它们的确相等。现在我们先记住这个结论,详细的情况将在下面讨论。 |
|||||||||||||||||||||
![]() |
助记符:SHL(Shift Left) 用 途:将寄存器或存储器中的数据向左移位 格 式:SHL 寄存器,1 SHL 寄存器,CL SHL 存储单元,1 SHL 存储单元,CL 执 行:寄存器或存储器中的数据所有位都向左移动一位或CL寄存器中指定位数,最高位移入CF标志 |
||||||||||||||||||||
SHL指令和前面所讲的SHR指令功能是相对的,这个指令在程序中的应用很特别,实际上程序是应用了移位的性质,即将一个数向左移一位相当于将这个数乘2,左移两位相当于乘4,而左移三位相当于乘8。同样向右移一位则相当于除以2,右移两位相当于除以4。 这个规律很容易验证:将1(0001b)左移两位可得0100b,恰好是4,而把8(1000b)右移两位即可得2(0010b)。不过必须说明一点,这个结论只对正数成立。 这是一个EXE程序,但是它和PROG7-A又有不同:主过程一开始并未初始化堆栈建立返回地址,而且结束进程用了21H中断的新功能--4CH。4CH功能是DOS提供而且提倡使用的进程结束功能,它比INT 20H要优越,而且这个功能允许向DOS返回一个错误码。它的应用方法如下: | |||||||||||||||||||||
![]() |
功能号:4CH 用 途:结束进程,返回操作系统,同时返回错误码。 参 数:AH=4CH AL=错误码 |
||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |