青岛大学2013期末考试汇编试题整理

更新时间:2023-12-03 05:14:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

青岛大学2012—2013 IBM-PC汇编语言程序设计期末试题 一、单项选择题(10分) 十个题,每题一分

二、填空题(12分)

八个题,十二个空,每空一分 三、程序填空题(20分) 四个题,十个空,一个空2分

1、 字符串挪动的问题,从一个地址移动到另一个地址 2、 找偶数的(貌似就是课本上的那个,第五章习题) 3、 在字符串中查找某个字符并用另一个字符代替 4、 关于宏的问题 四、程序分析题(20分) 四个题,每题五分 1、 做过的练习题

2、 两个数比较的问题

3、 第四章存储单元的分配dw,db,$,EQU 4、 在一个字符串中查找某个字符的问题 五、程序设计题(38分)

四个题,第一题八分,第二三四题每个十分 1、 在内存空间里的数用其他字符代替 2、 字符串比较的题目

3、 数组的运算,包括加减乘除 4、 课后练习题

三、程序填空题

1.1试编制宏定义,要求把存储器中的一个用EOT(ASCII码04H)字符结尾的字符串传送到另一个存储区去。

答:宏定义如下:

SEND

MACRO SCHARS, DCHARS LOCAL NEXT, EXIT PUSH PUSH MOV MOV MOV CMP JZ INC JMP

EXIT:

POP POP ENDM

2、试编写一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存放在AX中。

答:程序段如下:

BEGIN:

MOV MOV

COMPARE: MOV

BX, 0 CX, 100 AX, DATA[BX] AX SI SI, 0

AL, SCHARS[SI]

DCHARS[SI], AL AL, 04H ;;是EOT字符吗? EXIT SI NEXT SI AX

NEXT:

;取数组的第一个偶数 ;是偶数吗?

;不是,比较下一个数 ;没有偶数,退出

;最后一个数是偶数,即为最小偶数,退

;取数组的下一个偶数

ADD BX, 2 TEST AX, 01H LOOPNZ COMPARE JNZ STOP JCXZ 出

COMPARE1:

ADD TEST JNZ CMP JLE MOV

NEXT: STOP:

LOOP RET

STOP

MOV DX, DATA[BX]

BX, 2 DX, 01H NEXT AX, DX NEXT AX, DX COMPARE1

;是偶数吗?

;不是,比较下一个数 ;(AX)<(DX)吗?

;(AX)<(DX),则置换(AX)为最小偶数

3、 编写程序段,把字符串STRING中的‘&’字符用空格符代替。

STRING DB ‘The date is FEB&03’

答:程序段如下:

MOV MOV CLD MOV MOV LEA

CX, 18 AL, ‘&’

DI, SEG STRING ES, DI DI, STRING

REPNE SCASB JNE NEXT DEC MOV NEXT:

DI

ES:BYTE PTR [DI], ‘ ’ ┇

;送空格符

4、试编写宏定义SUMMING,要求求出双字数组中所有元素之和,并把结果保存下来。该宏定义的哑元应为数组首址ARRAY,数组长度COUNT和结果存放单元RESULT。

答:宏定义如下:

SUMMING

MACRO ARRAY,COUNT,RESULT LOCAL ADDITION

MOV MOV

ADDITION: MOV

ADD ADC

ESI, 0

ECX, COUNT

EAX, ARRAY[ESI*4] ;;双字为4字节 RESULT, EAX RESULT+4, 0

;;将进位加到结果的高位双字中

INC ESI

LOOP ADDITION ENDM

四、程序分析题

1.1(这个极有可能考)、假设X和X+2单元的内容为双精度数p,Y和Y+2单元的内容为双精度数q,(X和Y为低位字)试说明下列程序段做什么工作?

MOV DX, X+2 MOV AX, X ADD AX, X ADC DX, X+2 CMP JL JG CMP

DX, Y+2 L2 L1 AX, Y

JBE L2

L1: MOV AX, 1

JMP SHORT EXIT

L2: M发OV AX, 2 EXIT:INT 20H

答:此程序段判断p*2>q,则使(AX)=1后退出;p*2≤q,则使(AX)=2后退出。

1.2、试分析下面的程序段完成什么功能?

MOV SHL MOV SHL SHR

CL, 04 DX, CL BL, AH AX, CL BL, CL

OR DL, BL

答:本程序段将 ((DX),(AX)) 的双字同时左移4位,即将此双字乘以10H (16)。 1.3、试分析下列程序段:

ADD AX, BX

JNO JNC SUB JNC JNO

L1 L2 AX, BX L3 L4

JMP SHORT L5

如果AX和BX的内容给定如下: AX BX

(1) 147BH 80DCH (2) B568H (3) 42C8H

42C8H 608DH

(4) D023H 9FD0H (5) 94B7H B568H

问该程序分别在上面5种情况下执行后,程序转向哪里? 答:(1) 转向L1

(2) 转向L1

(3) 转向L2 (4) 转向L5 (5) 转向L5

;因为加法指令后AX中已经是6FF3H ;因为加法指令后AX中已经是4A14H

3.1假设程序中的数据定义如下:

PARTNO DW ?

PNAME DB 16 DUP (?) COUNT DD ? PLENTH EQU $-PARTNO

问PLENTH的值为多少?它表示什么意义?

答:PLENTH=22=16H,它表示变量PARTNO、PNAME、COUNT总共占用的存储单元

数(字节数)。 4.1设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式“SUN:xxxx”显示出次数。

答:程序如下:

DSEG ENG DISP

SEGMENT

DB ‘Here is sun, sun ,?,$’ DB ‘SUN:’

DAT DB ‘0000’ , 0DH, 0AH, ‘$’

KEYWORD DB ‘sun’ DSEG ENDS

;-------------------------------------------------------------------------- CSEG

SEGMENT PROC

FAR

ASSUME CS: CSEG, DS: DSEG, ES: DSEG PUSH DS ;设置返回DOS SUB AX, AX PUSH MOV MOV MOV

BEGIN:

MOV MOV LEA

COMP:

MOV LEA MOV REPE JNZ INC

ADD

NOMATCH: INC

DEC

DONE:

JNZ

MOV MOV LEA

DONE1:

ROL MOV AND ADD CMP JLE ADD

STORE:

AX AX, DSEG DS, AX ES, AX

;给DS赋值 ;给ES赋值

MAIN START:

AX, 0

DX, DISP-ENG-2 ;计算ENG的长度(每次比较sun,因此比

BX, ENG

较次数-2)

DI, BX SI, KEYWORD CX, 3 CMPSB

;串比较

;是,SUN的个数加1 ;指向ENG的下一个字母

NOMATCH AX BX, 2 BX

DX

COMP CH, 4

;将次数转换为16进制数的ASCII码

;转换结果存入DAT单元中

CL, 4

BX, DAT AX, CL DX, AX DL, 0FH DL, 30H DL, 39H STORE DL, 07H

;取一位16进制数

;是“A~F”所以要加7

;转换结果存入DAT单元中

MOV [BX], DL

INC BX DEC

CH

DONE1

DX, DISP AH, 09H

JNZ

DISPLAY: LEA 显示)

MOV

;显示字符串程序(将DISP和DAT一起

INT 21H

RET

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

END

START

4.2从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。

答:程序段如下:

DSEG

SEGMENT DB 50 DUP (‘ ’) DW 0 ENDS ┇ LEA MOV MOV INT MOV INC CMP JNZ LEA

NEXT:

MOV INC CMP JZ CMP JB CMP JA INC

DISP:

JMP

BX, BUFF COUNT, 0

AH, 01 21H

[BX], AL BX

AL, ‘$’

;是$结束符吗?

;不是,继续输入 ;对非数字字符进行计数

;从键盘输入一个字符的功能调用

BUFF

COUNT DSEG

BEGIN: INPUT:

INPUT BX, BUFF CL, [BX] BX

CL, ‘$’ DISP CL, 30H NEXT CL, 39H NEXT COUNT NEXT ┇

;是$结束符,则转去显示 ;小于0是非数字字符 ;大于9是非数字字符 ;个数+1

;16进制数显示程序段(省略)

4.3现有一个以$结尾的字符串,要求剔除其中的空格

.data

db ’Let us have a try !’,’$’ .code .startup

mov si,offset string cmp byte ptr [si],’$’

string

outlp:

;外循环,先判断后循环

jz done

;为$结束

;检测是否是空格

cmp byte ptr [si],’ ’

jnz next ;不是空格继续循环

mov di,si ;是空格,进入剔除空格分支

;该分支是循环程序段

inlp: inc di

mov al,[di] mov [di-1],al cmp byte ptr [di],’$’

;前移一个位置

;内循环,先循环后判断

jnz inlp jmp outlp inc si

;继续对后续字符进行处理

next:

jmp outlp .exit 0

;结束

done:

五、程序设计题

1.1、编写程序段,把字符串STRING中的‘&’字符用空格符代替。

STRING DB ‘The date is FEB&03’ 答:程序段如下:

MOV MOV CLD MOV MOV

CX, 18 AL, ‘&’

DI, SEG STRING ES, DI

LEA DI, STRING REPNE SCASB JNE DEC MOV NEXT:

2.1、试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’, 若不相同则显示‘NO MATCH’。

答:程序如下:

DSEG

SEGMENT

DB ‘I am a student.’

STRING1

NEXT

DI

ES:BYTE PTR [DI], ‘ ’ ┇

;送空格符

STRING2 DB ‘I am a student!’

YES DB ‘MATCH’, 0DH, 0AH, ‘$’ NO DB ‘NO MATCH’, 0DH, 0AH, ‘$’ DSEG ENDS

;-------------------------------------------------------------------------- CSEG

SEGMENT PROC

FAR

ASSUME CS: CSEG, DS: DSEG, ES: DSEG PUSH DS ;设置返回DOS SUB PUSH MOV MOV MOV

BEGIN:

LEA LEA CLD MOV REPE JNE LEA

JMP

DISPNO: LEA DISPLAY: MOV

INT RET

AX, AX AX

AX, DSEG DS, AX ES, AX

MAIN START:

;给DS赋值 ;给ES赋值

;设置串比较指令的初值

SI, STRING1

DI, STRING2

CX, STRING2 - STRING1 CMPSB ;串比较 DISPNO DX, YES DISPLAY DX, NO AH, 9 21H

;显示MATCH

;显示NO MATCH

;显示一个字符串的DOS调用

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

END

STAR

2.2编写一程序段:比较两个5字节的字符串OLDS和NEWS,如果OLDS字符串不同于NEWS字符串则执行NEW_LESS;否则顺序执行程序。

答:程序段如下:

MOV CLD MOV MOV MOV LEA LEA REPE JNE

CX, 5

DI, SEG OLDS DS, DI ES, DI SI, OLDS DI, NEWS CMPSB NEW_LESS

NEW_LESS: ┇

3.1把0~100D之间的30个数存入以GRADE为首地址的30字数组中,GRADE+i表示学号为i+1的学生的成绩。另一个数组RANK为30个学生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。编写一程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。(提示:一个学生的名次等于成绩高于这个学生的人数加1。)

答:程序如下:

DSEG GRADE

SEGMENT DW 30 DUP (?)

;假设已预先存好30名学生的成绩

RANK DW 30 DUP (?)

DSEG ENDS

;-------------------------------------------------------------------------- CSEG

SEGMENT

PROC FAR

ASSUME CS: CSEG, DS: DSEG PUSH DS ;设置返回DOS SUB PUSH MOV MOV

BEGIN: LOOP1:

MOV MOV PUSH MOV MOV MOV MOV CMP JBE INC

GO_ON:

DI, 0 CX, 30 CX

CX, 30

;外循环计数器 ;内循环计数器

AX, AX AX AX, DSEG DS, AX

;给DS赋值

MAIN START:

LOOP2:

SI, 0

AX, GRADE [DI] DX, 1 ;起始名次为第1名 GRADE [SI], AX ;成绩比较 GO_ON DX

;名次+1

ADD SI, 2

LOOP LOOP2 POP MOV ADD

CX

RNAK [DI], DX ;名次存入RANK数组 DI, 2

LOOP LOOP1 RET

MAIN CSEG

ENDP ENDS END

3.1实现数组运算

数组X(X1,…,X10)和数组Y(Y1,…,Y10),计算

;以上定义代码段

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

START

Z1=X1+Y1 Z2=X2+Y2

Z5=X5-Y5 Z6=X6+Y6

Z8=X8 -Y8 Z9=X9+Y9 Z10=X10+Y10

Z3=X3-Y3 Z4=X4-Y4

Z7=X7-Y7

结果存入Z数组。

;设置标志位:0做加法;1做减法

;逻辑尺:存放10各标志位,在LOGIC_RULE存储单元中

0000 00 00 1101 1100

最高的6位无意义,从低位开始所设的标志位指示每次要做的操作顺序。 .model small

.stack .data x y z

dw x1 , x2 ,x3 ,x4 ,x5 ,x6 ,x7 ,x8 ,x9 ,x10 dw y1 , y2 ,y3 ,y4 ,y5 ,y6 ,y7 ,y8 ,y9 ,y10 dw z1 ,z2 ,z3 ,z4 ,z5 ,z6 ,z7 ,z8 ,z9 ,z10

dw 00dch

logic_rule .code .startup

mov bx , 0 mov cx , 10 mov dx , logic_rule

Next:

mov ax , x[bx]

shr dx , 1 jc subtract add ax , y[bx] jmp short result

Substract:

sub ax , y[bx]

Result:

mov z[bx] , ax add bx ,2

本文来源:https://www.bwwdw.com/article/o75t.html

Top