汇编语言习题详解(全部)(免费)(7)

2019-04-14 18:45

11798352.doc - 30 -

LEA DX, CRLF MOV AH, 09H ;显示回车换行 INT 21H RET

DISPLAY ENDP

;-------------------------------------------------------------------------- BINIHEX PROC NEAR ;将BX中二进制数转换为16进制数显示子程序

MOV CH, 4

ROTATE: MOV CL, 4

ROL BX, CL MOV DL, BL AND DL, 0FH ADD DL, 30H CMP DL, 3AH ;是A~F吗? JL PRINT_IT ADD DL, 07H

PRINT_IT: MOV AH, 02H ;显示一个字符

INT 21H DEC CH JNZ ROTATE RET

BINIHEX ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START

5.23 已定义了两个整数变量A和B,试编写程序完成下列功能:

(1) 若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中; (2) 若两个数中均为奇数,则将两数加1后存回原变量; (3) 若两个数中均为偶数,则两个变量均不改变。 答:程序如下:

DSEG SEGMENT A DW ? B DW ? 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 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同为偶数,转走

11798352.doc - 31 -

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 ;以上定义代码段

11798352.doc - 32 -

;--------------------------------------------------------------------------

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 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 BX, MUL2 ;取乘数

MOV AX, WORD PTR MUL1 ;取被乘数低位字 MUL BX

MOV MUL0, AX ;保存部分积低位 MOV MUL0+2, DX ;保存部分积高位

MOV AX, WORD PTR[MUL1+2] ;取被乘数高位字 MUL BX

ADD MUL0+2, AX ;部分积低位和原部分积高位相加 ADC MUL0+4, DX ;保存部分积最高位,并加上进位

EXIT: RET MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START

80386的程序如下(假设为无符号数):

.386

DSEG SEGMENT MUL1 DD ? ;32位被乘数 MUL2 DW ? ;16位乘数 MUL0 DD 0,0 ;乘积用64位单元存放 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: MOVZX EBX, MUL2 ;取乘数,并0扩展成32位

MOV EAX, MUL1 ;取被乘数 MUL EBX

MOV DWORD PTR MUL0, EAX ;保存积的低位双字

11798352.doc - 33 -

MOV DWORD PTR[MUL0+4], EDX ;保存积的高位双字

EXIT: RET MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------

END START 80386作32位乘法运算用一条指令即可完成,而8086则需用部分积作两次完成。

5.26 如数据段中在首地址为MESS1的数据区内存放着一个长度为35的字符串,要求把它们传送到附

加段中的缓冲区MESS2中去。为提高程序执行效率,希望主要采用MOVSD指令来实现。试编写这一程序。

答:80386的程序如下:

.386

.MODEL SMALL .STACK 100H .DATA

MESS1 DB ?123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ?,? ;长度为35的字符串

.FARDATA

MESS2 DB 36 DUP (?)

.CODE

START: MOV AX, @DATA

MOV DS, AX ;给DS赋值 MOV AX, @FARDATA MOV ES, AX ;给ES赋值 ASSUME ES:@FARDATA

BEGIN: LEA ESI, MESS1

LEA EDI, MESS2 CLD

MOV ECX, (35+1)/4 ;取传送的次数 REP MOVSD

;--------------------------------------------------------------------------

MOV AX, 4C00H ;返回DOS INT 21H END START 5.27 试用比例变址寻址方式编写一386程序,要求把两个64位整数相加并保存结果。

答:80386的程序如下:

.386

.MODEL SMALL .STACK 100H .DATA

DATA1 DQ ? DATA2 DQ ?

.CODE

START: MOV AX, @DATA

MOV DS, AX ;给DS赋值

BEGIN: MOV ESI, 0

MOV EAX, DWORD PTR DATA2[ESI*4] ADD DWORD PTR DATA1[ESI*4], EAX INC ESI

MOV EAX, DWORD PTR DATA2[ESI*4] ADC DWORD PTR DATA1[ESI*4], EAX

;--------------------------------------------------------------------------

MOV AX, 4C00H ;返回DOS INT 21H END START

11798352.doc - 34 -

第 六 章. 习 题

6.1 下面的程序段有错吗?若有,请指出错误。

CRAY PROC

PUSH AX ADD AX, BX RET

ENDP CRAY

答:程序有错。改正如下:

CRAY PROC

ADD AX, BX RET

CRAY ENDP ;CRAY是过程名,应放在ENDP的前面 6.2 已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H和0F79BH分别入栈的PUSH指令,然后执行一条POP指令。试画出示意图说明堆栈及SP内容的变化过程。

9BH 再PUSH,SP-2 答:变化过程如右图所示:

F7H POP, SP+2 6.3 分析下面的程序,画出堆栈最满时各单元的地址及内容。先 PUSH,SP-2 57H 80H ;********************************************

F0A0:00B0H S_SEG SEGMENT AT 1000H ;定义堆栈段

6.2 题堆栈及SP内容的变化过程 DW 200 DUP (?) ;200*2=190H

TOS LABEL WORD S_SEG ENDS

;******************************************** C_SEG SEGMENT ;定义代码段

ASSUME CS: C_SEG, SS: S_SEG

START: MOV AX, S_SEG

MOV SS, AX 1000:0184 MOV SP, OFFSET TOS :0186 (FLAGS) :0188 (AX) PUSH DS :018A T_ADDR MOV AX, 0 :018C 0000 PUSH AX :018E (DS) ┇ PUSH T_ADDR SP: 0186 PUSH AX

6.3 题堆栈最满时各PUSHF

单元的地址及内容 ┇

POPF POP AX

POP T_ADDR RET

;-------------------------------------------------------------------------- C_SEG ENDS ;代码段结束 ;******************************************

END START ;程序结束

答:堆栈最满时各单元的地址及内容如右图所示: 6.4 分析下面的程序,写出堆栈最满时各单元的地址及内容。

;******************************************** STACK SEGMENT AT 500H ;定义堆栈段

DW 128 DUP (?)

TOS LABEL WORD STACK ENDS

;******************************************** CODE SEGMENT ;定义代码段


汇编语言习题详解(全部)(免费)(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Excel编程实例(170例)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: