IBM-PC汇编语言程序设计课后习题答案第二版沉美明资料 下载本文

-------------------------------------------------------------------------- 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