;
-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX MOV AX, DSEG
MOV DS, AX ;给DS赋值 BEGIN: MOV AX, A MOV BX, B XOR AX, BX
TEST AX, 0001H ;A和B同为奇数或偶数吗? JZ CLASS ;A和B都为奇数或偶数,转走 TEST BX, 0001H
JZ EXIT ;B为偶数,转走
XCHG BX, A ;A为偶数,将奇数存入A中 MOV B, BX ;将偶数存入B中 JMP EXIT
CLASS: TEST BX, 0001H ;A和B都为奇数吗? JZ EXIT ;A和B同为偶数,转走 INC B
INC A EXIT: RET MAIN ENDP
CSEG ENDS ;以上定义代码段
;
-------------------------------------------------------------------------- END START
5.24 假设已编制好5个歌曲程序,它们的段地址和偏移地址存放在数据段的跳跃表SINGLIST中。试编制一程序,根据从键盘输入的歌曲编号1~5,转去执行五个歌曲程序中的某一个。 答:程序如下: DSEG SEGMENT SINGLIST DD SING1 DD SING2 DD SING3 DD SING4 DD SING5
ERRMSG DB ‘Error! Invalid parameter!’, 0DH, 0AH, ‘$’ DSEG ENDS
;
-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG
START: PUSH DS ;设置返回DOS SUB AX, AX PUSH AX MOV AX, DSEG
MOV DS, AX ;给DS赋值
BEGIN: MOV AH, 1 ;从键盘输入的歌曲编号1~5 INT 21H CMP AL, 0DH
JZ EXIT ;是回车符,则结束 SUB AL, ‘1’ ;是1~5吗? JB ERROR ;小于1,错误 CMP AL, 4
JA ERROR ;大于5,错误 MOV BX, OFFSET SINGLIST
MUL AX, 4 ;(AX)=(AL)*4,每个歌曲程序的首地址占4个字节 ADD BX, AX
JMP DWORD PTR[BX] ;转去执行歌曲程序 ERROR: MOV DX, OFFSET ERRMSG MOV AH, 09H
INT 21H ;显示错误信息 JMP BEGIN SING1: ┇ JMP BEGIN SING2: ┇
JMP BEGIN SING3: ┇ JMP BEGIN SING4: ┇ JMP BEGIN SING5: ┇ JMP BEGIN EXIT: RET MAIN ENDP
CSEG ENDS ;以上定义代码段
;
-------------------------------------------------------------------------- END START
5.25 试用8086的乘法指令编制一个32位数和16位数相乘的程序;再用80386的乘法指令编制一个32位数和16位数相乘的程序,并定性比较两个程序的效率。 答:8086的程序如下(假设为无符号数): DSEG SEGMENT
MUL1 DD ? ;32位被乘数 MUL2 DW ? ;16位乘数
MUL0 DW 0,0 ,0 ,0 ;乘积用64位单元存放 DSEG ENDS
;
-------------------------------------------------------------------------- CSEG SEGMENT