汇编语言第五章答案

汇编语言第五章答案
汇编语言第五章答案

5.1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。

答:程序段如下:

BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用

INT 21H

CMP AL, …a? ;输入字符<…a?吗?

JB STOP

CMP AL, …z? ;输入字符>…z?吗?

JA STOP

SUB AL, 20H ;转换为大写字母,用AND AL, 1101 1111B也可

MOV DL, AL ;显示一个字符的DOS调用

MOV AH, 2

INT 21H

JMP BEGIN

STOP: RET

5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。

答:程序段如下:

BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用

INT 21H

CMP AL, …a? ;输入字符<…a?吗?

JB STOP

CMP AL, …z? ;输入字符>…z?吗?

JA STOP

DEC AL ;得到前导字符

MOV DL, AL ;准备显示三个字符

MOV CX, 3

DISPLAY: MOV AH, 2 ;显示一个字符的DOS调用

INT 21H

INC DL

LOOP DISPLAY

STOP: RET

5.3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL 和DL中。

答:程序段如下:

DSEG SEGMENT

STORE DB 4 DUP (?)

DSEG ENDS

BEGIN: MOV CL, 4 ;右移四次

MOV CH, 4 ;循环四次

LEA BX, STORE

A10: MOV DX, AX

AND DX, 0FH ;取AX的低四位

MOV [BX], DL ;低四位存入STORE中

INC BX

SHR AX, CL ;右移四次

DEC CH

JNZ A10 ;循环四次完了码?

B10: MOV DL, STORE ;四组数分别放在AL、BL、CL和DL中

MOV CL, STORE+1

MOV BL, STORE+2

MOV AL, STORE+3

STOP: RET

5.4 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示…MA TCH?,若不相同则显示…NO MA TCH?。

答:程序如下:

DSEG SEGMENT

STRING1 DB …I am a student.?

STRING2 DB …I am a student!?

YES DB …MATCH?, 0DH, 0AH, …$?

NO DB …NO MATCH?, 0DH, 0AH, …$?

DSEG ENDS

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

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS: CSEG, DS: DSEG, ES: DSEG

START: PUSH DS ;设置返回DOS

SUB AX, AX

PUSH AX

MOV AX, DSEG

MOV DS, AX ;给DS赋值

MOV ES, AX ;给ES赋值

BEGIN: LEA SI, STRING1 ;设置串比较指令的初值

LEA DI, STRING2

CLD

MOV CX, STRING2 - STRING1

REPE CMPSB ;串比较

JNE DISPNO

LEA DX, YES ;显示MA TCH

JMP DISPLAY

DISPNO: LEA DX, NO ;显示NO MATCH

DISPLAY: MOV AH, 9 ;显示一个字符串的DOS调用

INT 21H

RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

5.5 试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07)。答:程序段如下:

BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用

INT 21H

SUB AL, …0?

JB STOP ;输入字符<…0?吗?

CMP AL, 9 ;输入字符>…9?吗?

JA STOP

CBW

MOV CX, AX ;响铃次数N

JCXZ STOP

BELL: MOV DL, 07H ;准备响铃

MOV AH, 2 ;显示一个字符的DOS调用,实际为响铃

INT 21H

CALL DELAY100ms ;延时100ms

LOOP BELL

STOP: RET

5.6 编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中数据的个数显示出来。

答:程序如下:

DSEG SEGMENT

COUNT EQU 20

ARRAY DW 20 DUP (?) ;存放数组

COUNT1 DB 0 ;存放正数的个数

ARRAY1 DW 20 DUP (?) ;存放正数

COUNT2 DB 0 ;存放负数的个数

ARRAY2 DW 20 DUP (?) ;存放负数

ZHEN DB 0DH, 0AH, …The positive number is:?, …$? ;正数的个数是:

FU DB 0DH, 0AH, …The negative number is:?, …$? ;负数的个数是:

CRLF DB 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 CX, COUNT

LEA BX, ARRAY

LEA SI, ARRAY1

LEA DI, ARRAY2

BEGIN1: MOV AX, [BX]

CMP AX, 0 ;是负数码?

JS FUSHU

MOV [SI], AX ;是正数,存入正数数组

INC COUNT1 ;正数个数+1

ADD SI, 2

JMP SHORT NEXT

FUSHU: MOV [DI], AX ;是负数,存入负数数组

INC COUNT2 ;负数个数+1

ADD DI, 2

NEXT: ADD BX, 2

LOOP BEGIN1

LEA DX, ZHEN ;显示正数个数

MOV AL, COUNT1

CALL DISPLAY ;调显示子程序

LEA DX, FU ;显示负数个数

MOV AL, COUNT2

CALL DISPLAY ;调显示子程序

RET

MAIN ENDP

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

DISPLAY PROC NEAR ;显示子程序

MOV AH, 9 ;显示一个字符串的DOS调用

INT 21H

AAM ;将(AL)中的二进制数转换为二个非压缩BCD码

ADD AH, …0? ;变为0~9的ASCII码

MOV DL, AH

MOV AH, 2 ;显示一个字符的DOS调用

INT 21H

ADD AL, …0? ;变为0~9的ASCII码

MOV DL, AL

MOV AH, 2 ;显示一个字符的DOS调用

INT 21H

LEA DX, CRLF ;显示回车换行

MOV AH, 9 ;显示一个字符串的DOS调用

INT 21H

RET

DISPLAY ENDP ;显示子程序结束

CSEG ENDS ;以上定义代码段

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

END START

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

答:程序段如下:

BEGIN: MOV BX, 0

MOV CX, 100

COMPARE: MOV AX, DA TA[BX] ;取数组的第一个偶数

ADD BX, 2

TEST AX, 01H ;是偶数吗?

LOOPNZ COMPARE ;不是,比较下一个数

JNZ STOP ;没有偶数,退出

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

COMPARE1: MOV DX, DA TA[BX] ;取数组的下一个偶数

ADD BX, 2

TEST DX, 01H ;是偶数吗?

JNZ NEXT ;不是,比较下一个数

CMP AX, DX ;(AX)<(DX)吗?

JLE NEXT

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

NEXT: LOOP COMPARE1

STOP: RET

5.8 把AX中存放的16位二进制数K看作是8个二进制的“四分之一字节”。试编写程序要求数一下值为3(即11B)的四分之一字节数,并将该数(即11B的个数)在终端上显示出来。

答:程序段如下:

BEGIN: MOV DL, 0 ;计数初始值

MOV CX, 8

COMPARE: TEST AX, 03H ;是数03吗?

JNZ NOEQUAL ;不是,转走

INC DL ;是,计数

NOEQUAL: ROR AX, 1 ;准备判断下一个数

ROR AX, 1

LOOP COMPARE

ADD DL, …0? ;将计数值转换为ASCII码

MOV AH, 2 ;进行显示

INT 21H

STOP: RET

5.9 试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数,并在终端上显示与它等值的二进制数。

答:程序段如下:

BEGIN: MOV BX, 0 ;用于存放四位的16进制数

MOV CH, 4

MOV CL, 4

INPUT: SHL BX, CL ;将前面输入的数左移4位

MOV AH, 1 ;从键盘取数

INT 21H

CMP AL, 30H ;<0吗?

JB INPUT ;不是…0~F?的数重新输入

CMP AL, 39H ;是…0~9?吗?

JA AF ;不是,转…A~F?的处理

AND AL, 0FH ;转换为:0000B~1001B

JMP BINARY

AF: AND AL, 1101 1111B ;转换为大写字母

CMP AL, 41H ;又

JB INPUT ;不是…A~F?的数重新输入

CMP AL, 46H ;>F吗?

JA INPUT ;不是…A~F?的数重新输入

AND AL, 0FH ;转换为:1010B~1111B

ADD AL, 9

BINARY: OR BL, AL ;将键盘输入的数进行组合

DEL CH

JNZ INPUT

DISPN: MOV CX, 16 ;将16位二进制数一位位地转换成ASCII码显示

DISP: MOV DL, 0

ROL BX, 1

RCL DL, 1

OR DL, 30H

MOV AH, 2 ;进行显示

INT 21H

LOOP DISP

STOP: RET

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

答:程序如下:

DSEG SEGMENT

ENG DB …Here is sun, sun ,…,$?

DISP DB …SUN:?

DAT DB …0000? , 0DH, 0AH, …$?

KEYWORD DB …sun?

DSEG ENDS

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

CSEG SEGMENT

MAIN PROC FAR

ASSUME CS: CSEG, DS: DSEG, ES: DSEG

START: PUSH DS ;设置返回DOS

SUB AX, AX

PUSH AX

MOV AX, DSEG

MOV DS, AX ;给DS赋值

MOV ES, AX ;给ES赋值

BEGIN: MOV AX, 0

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

LEA BX, ENG

COMP: MOV DI, BX

LEA SI, KEYWORD

MOV CX, 3

REPE CMPSB ;串比较

JNZ NOMATCH

INC AX ;是,SUN的个数加1

ADD BX, 2

NOMA TCH: INC BX ;指向ENG的下一个字母

DEC DX

JNZ COMP

DONE: MOV CH, 4 ;将次数转换为16进制数的ASCII码

MOV CL, 4

LEA BX, DAT ;转换结果存入DA T单元中

DONE1: ROL AX, CL

MOV DX, AX

AND DL, 0FH ;取一位16进制数

ADD DL, 30H

CMP DL, 39H

JLE STORE

ADD DL, 07H ;是“A~F”所以要加7

STORE: MOV [BX], DL ;转换结果存入DA T单元中

INC BX

DEC CH

JNZ DONE1

DISPLAY: LEA DX, DISP ;显示字符串程序(将DISP和DA T一起显示)

MOV AH, 09H

INT 21H

RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

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

答:程序段如下:

DSEG SEGMENT

BUFF DB 50 DUP (… ?)

COUNT DW 0

DSEG ENDS

BEGIN: LEA BX, BUFF

MOV COUNT, 0

INPUT: MOV AH, 01 ;从键盘输入一个字符的功能调用

INT 21H

MOV [BX], AL

INC BX

CMP AL, …$? ;是$结束符吗?

JNZ INPUT ;不是,继续输入

LEA BX, BUFF ;对非数字字符进行计数

NEXT: MOV CL, [BX]

INC BX

CMP CL, …$? ;是$结束符,则转去显示

JZ DISP

CMP CL, 30H ;小于0是非数字字符

JB NEXT

CMP CL, 39H ;大于9是非数字字符

JA NEXT

INC COUNT ;个数+1

JMP NEXT

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

5.12 有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为0的项,并将后续项向前压缩,最后将数组的剩余部分补上0。

答:程序如下:

DSEG SEGMENT

MEM DW 100 DUP (?)

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 SI, (100-1)*2 ;(SI)指向MEM的末元素的首地址

MOV BX, -2 ;地址指针的初值

MOV CX, 100

COMP: ADD BX, 2

CMP MEM [BX], 0

JZ CONS

LOOP COMP

JMP FINISH ;比较完了,已无0则结束

CONS: MOV DI, BX

CONS1: CMP DI, SI ;到了最后单元码?

JAE NOMOV

MOV AX, MEM [DI+2] ;后面的元素向前移位

MOV MEM [DI], AX

ADD DI, 2

JMP CONS1

NOMOV: MOV WORD PTR [SI], 0 ;最后单元补0

LOOP COMP

FINISH: RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

5.13 在STRING到STRING+99单元中存放着一个字符串,试编制一个程序测试该字符串中是否存在数字,如有则把CL的第5位置1,否则将该位置0。

答:程序如下:

DSEG SEGMENT

STRING DB 100 DUP (?)

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 SI, 0 ;(SI)作为地址指针的变化值

MOV CX, 100

REPEAT: MOV AL, STRING [SI]

CMP AL, 30H

JB GO_ON

CMP AL, 39H

JA GO_ON

OR CL, 20H ;存在数字把CL的第5位置1

JMP EXIT

GO_ON: INC SI

LOOP REPEAT

AND CL, 0DFH ;不存在数字把CL的第5位置0

EXIT: RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

5.14 在首地址为TABLE的数组中按递增次序存放着100H个16位补码数,试编写一个程序把出现次数最多的数及其出现次数分别存放于AX和CX中。

答:程序如下:

DSEG SEGMENT

TABLE DW 100H DUP (?) ;数组中的数据是按增序排列的

DA TA DW ?

COUNT DW 0

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 CX, 100H ;循环计数器

MOV SI, 0

NEXT: MOV DX, 0

MOV AX, TABLE [SI]

COMP: CMP TABLE [SI], AX ;计算一个数的出现次数

JNE ADDR

INC DX

ADD SI, 2

LOOP COMP

ADDR: CMP DX, COUNT ;此数出现的次数最多吗?

JLE DONE

MOV COUNT, DX ;目前此数出现的次数最多,记下次数

MOV DATA, AX ;记下此数

DONE: LOOP NEXT ;准备取下一个数

MOV CX, COUNT ;出现最多的次数存入(CX)

MOV AX, DATA ;出现最多的数存入(AX)

RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

5.15 数据段中已定义了一个有n个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。

答:程序如下:

DSEG SEGMENT

n EQU 100H ;假设n=100H

M DW n DUP (?)

DA TA DW ? ;M+2n单元

ADDR DW ? ;M+2(n+1)单元

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 CX, n ;循环计数器

LEA DI, M

MOV AX, [DI] ;取第一个数

MOV ADDR, DI ;记下绝对值最大的数的地址

CMP AX, 0 ;此数是正数吗?

JNS ZHEN ;是正数,即为绝对值,转去判断下一个数

NEG AX ;不是正数,变为其绝对值

ZHEN: MOV BX, [DI]

CMP BX, 0 ;此数是正数吗?

JNS COMP ;是正数,即为绝对值,转去比较绝对值大小

NEG BX ;不是正数,变为其绝对值

COMP: CMP AX, BX ;判断绝对值大小

JAE ADDRESS

MOV AX, BX ;(AX)<(BX),使(AX)中为绝对值最大的数

MOV ADDR, DI ;记下绝对值最大的数的地址

ADDRESS: ADD DI, 2

LOOP ZHEN

MOV DATA, AX ;记下此数

RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

5.16 在首地址为DA TA的字数组中存放着100H个16位补码数,试编写一个程序求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小于此平均值,将结果放在BX寄存器中。

答:程序如下:

DSEG SEGMENT

DA TA DW 100H DUP (?)

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 CX, 100H ;循环计数器

MOV SI, 0

MOV BX, 0 ;和((DI),(BX))的初始值

MOV DI, 0

NEXT: MOV AX, DA TA [SI]

CWD

ADD BX, AX ;求和

ADC DI, DX ;加上进位位

ADD SI, 2

LOOP NEXT

MOV DX, DI ;将((DI),(BX))中的累加和放入((DX),(AX))中

MOV AX, BX

MOV CX, 100H

IDIV CX ;带符号数求平均值,放入(AX)中

MOV BX, 0

MOV SI, 0

COMP: CMP AX, DATA [SI] ;寻找小于平均值的数

JLE NO

INC BX ;小于平均值数的个数+1

NO: ADD SI, 2

LOOP COMP

RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

5.17 试编制一个程序把AX中的16进制数转换为ASCII码,并将对应的ASCII码依次存放到MEM数组中的四个字节中。例如,当(AX)=2A49H时,程序执行完后,MEM中的4个字节内容为39H,34H,41H,32H。

答:程序如下:

DSEG SEGMENT

MEM DB 4 DUP (?)

N DW 2A49H

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 CH, 4 ;循环计数器

MOV CL, 4

MOV AX, N

LEA BX, MEM

ROTA TE: MOV DL, AL ;从最低四位开始转换为ASCII码

AND DL, 0FH

ADD DL, 30H

CMP DL, 3AH ;是0~9吗?

JL NEXT

ADD DL, 07H ;是A~F

NEXT: MOV [BX], DL ;转换的ASCII码送入MEM中

INC BX

ROR AX, CL ;准备转换下一位

DEC CH

JNZ ROTATE

RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

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

答:程序如下:

DSEG SEGMENT

GRADE DW 30 DUP (?) ;假设已预先存好30名学生的成绩

RANK DW 30 DUP (?)

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 DI, 0

MOV CX, 30 ;外循环计数器

LOOP1: PUSH CX

MOV CX, 30 ;内循环计数器

MOV SI, 0

MOV AX, GRADE [DI]

MOV DX, 1 ;起始名次为第1名

LOOP2: CMP GRADE [SI], AX ;成绩比较

JBE GO_ON

INC DX ;名次+1

GO_ON: ADD SI, 2

LOOP LOOP2

POP CX

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

ADD DI, 2

LOOP LOOP1

RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

5.19 已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一程序把既在A中又在B中出现的整数存放于数组C中。

答:程序如下:

DSEG SEGMENT

A DW 15 DUP (?)

B DW 20 DUP (?)

C DW 15 DUP (… ?)

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 SI, 0

MOV BX, 0

MOV CX, 15 ;外循环计数器

LOOP1: PUSH CX

MOV CX, 20 ;内循环计数器

MOV DI, 0

MOV AX, A [SI] ;取A数组中的一个数

LOOP2: CMP B [DI], AX ;和B数组中的数相等吗?

MOV C [BX], AX ;相等存入C数组中

ADD BX, 2

NO: ADD DI, 2

LOOP LOOP2

ADD SI, 2

POP CX

LOOP LOOP1

RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

5.20 设在A、B和C单元中分别存放着三个数。若三个数都不是0,则求出三数之和存放在D单元中;若其中有一个数为0,则把其它两单元也清0。请编写此程序。

答:程序如下:

DSEG SEGMENT

A DW ?

B DW ?

C DW ?

D DW 0

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: CMP A, 0

JE NEXT

CMP B, 0

JE NEXT

CMP C, 0

JE NEXT

MOV AX, A

ADD AX, B

ADD AX, C

MOV D, AX

JMP SHORT EXIT

NEXT: MOV A, 0

MOV B, 0

EXIT: RET

MAIN ENDP

CSEG ENDS ;以上定义代码段

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

END START

5.21 试编写一程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在终端上显示如下信息:

(1) 如果三个数都不相等则显示0;

(2) 如果三个数有二个数相等则显示1;

(3) 如果三个数都相等则显示2。

答:程序如下:

DSEG SEGMENT

ARRAY DW 3 DUP (?)

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: LEA SI, ARRAY

MOV DX, 0 ;(DX)用于存放所求的结果

MOV AX, [SI]

MOV BX, [SI+2]

CMP AX, BX ;比较第一和第二两个数是否相等

JNE NEXT1

INC DX

NEXT1: CMP [SI+4], AX ;比较第一和第三两个数是否相等

JNE NEXT2

INC DX

NEXT2: CMP [SI+4], BX ;比较第二和第三两个数是否相等

JNE NUM

INC DX

NUM: CMP DX, 3

JL DISP

DEC DX

DISP: ADD DL, 30H ;转换为ASCII码

MOV AH, 2 ;显示一个字符

INT 21H

RET

CSEG ENDS ;以上定义代码段

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

END START

5.22 从键盘输入一系列字符(以回车符结束),并按字母、数字、及其它字符分类计数,最后显示出这三类的计数结果。

答:程序如下:

DSEG SEGMENT

ALPHABET DB …输入的字母字符个数为:?, …$?

NUMBER DB …输入的数字字符个数为:?, …$?

OTHER DB …输入的其它字符个数为:?, …$?

CRLF DB 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 BX, 0 ;字母字符计数器

MOV SI, 0 ;数字字符计数器

MOV DI, 0 ;其它字符计数器

INPUT: MOV AH, 1 ;输入一个字符

INT 21H

CMP AL, 0DH ;是回车符吗?

JE DISP

CMP AL, 30H ;<数字0吗?

JAE NEXT1

OTHER: INC DI ;是其它字符

JMP SHORT INPUT

NEXT1: CMP AL, 39H ;>数字9吗?

JA NEXT2

INC SI ;是数字字符

JMP SHORT INPUT

NEXT2: CMP AL, 41H ;<字母A吗?

JAE NEXT3

JMP SHORT OTHER ;是其它字符

NEXT3: CMP AL, 5AH ;>字母Z吗?

JA NEXT4

INC BX ;是字母字符A~Z

JMP SHORT INPUT

NEXT4: CMP AL, 61H ;<字母a吗?

JAE NEXT5

JMP SHORT OTHER ;是其它字符

NEXT5: CMP AL, 7AH ;>字母z吗?

JA SHORT OTHER ;是其它字符

INC BX ;是字母字符a~z

JMP SHORT INPUT

DISP: LEA DX, ALPHABET

CALL DISPLAY

LEA DX, NUMBER

MOV BX, SI

CALL DISPLAY

LEA DX, OTHER

MOV BX, DI

CALL DISPLAY

RET

MAIN ENDP

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

DISPLAY PROC NEAR

MOV AH, 09H ;显示字符串功能调用

INT 21H

CALL BINIHEX ;调把BX中二进制数转换为16进制显示子程序

LEA DX, CRLF

MOV AH, 09H ;显示回车换行

INT 21H

RET

DISPLAY ENDP

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

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

ROTA TE: 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同为偶数,转走

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

汇编语言第二章答案

2.1 在80x86微机的输入/输出指令中,I/O端口号通常是由DX寄存器提供的,但有时也可以在指令中直接指定00~FFH的端口号。试问可直接由指令指定的I/O端口数。 答:可直接由指令指定的I/O端口数为256个。 2.2 有两个16位字1EE5H和2A3CH分别存放在80x86微机的存储器的000B0H和000B3H单元中,请用图表示出它们在存储器里的存放情况。 答:存储器里的存放情况如右下图所示: 000B0H E5H 000B1H 1EH 000B2H 000B3H 3CH 000B4H 2AH 2.3在IBM PC机的存储器中存放信息如右下图所示。试读出30022H和30024H字节单元的内容,以及30021H和30022H字单元的内容。 30020H 12H 30021H 34H 30022H ABH 30023H CDH 30024H EFH 答:30022H字节单元的内容为ABH;30024H字节单元的内容为EFH。30021H字单元的内容为AB34H;30022H字单元的内容为CDABH。 2.4 在实模式下,段地址和偏移地址为3017:000A的存储单元的物理地址是什么?如果段地址和偏移地址是3015:002A和3010:007A呢? 答:3017:000A、3015:002A和3010:007A的存储单元的物理地址都是3017AH。 2.5 如果在一个程序开始执行以前(CS)=0A7F0H,(如16进制数的最高位为字母,则应在其前加一个0) (IP)=2B40H,试问该程序的第一个字的物理地址是多少? 答:该程序的第一个字的物理地址是0AAA40H。 2.6在实模式下,存储器中每一段最多可有10000H个字节。如果用调试程序DEBUG的r命令在终端上显示出当前各寄存器的内容如下,请画出此时存储器分段的示意图,以及条件标志OF、SF、ZF、CF的值。 C>debug -r AX=0000 BX=0000 CX=0079 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=10E4 ES=10F4 SS=21F0 CS=31FF IP=0100 NV UP DI PL NZ NA PO NC 答:此时存储器分段的示意图如右图所示。OF、SF、ZF、CF的值都为0。 2.7 下列操作可使用那些寄存器?

第4章汇编语言程序设计.

第四章习题集 一、判断 (正确的在括号画“√” , 错误的画“×” 1. 汇编语言程序语言必须由四部分组成。 ( 2. 汇编语言源程序中所使用的变量,必须在代码段中先定义,后引用。 (错 3. 在汇编语言中,一般伪指令语句放在代码段中 (错 4. 逻辑操作符 AND 、 OR 、 XOR 或 NOT ,只能用于数字表达式。 ( 错 5. 符号定义语句不占内存单元,变量定义语句占内存单元。 ( 6. 汇编语言源程序中至少有一个代码段。 ( 对 7. 伪指令是指示性语句 , 不产生机器目标代码。( √ 8. 伪指令BV AR :DB ‘ ABCD ’ , 200 DUP(?是合法伪指令。 9. 伪指令 DAT1 DB 7, 8, 9, 10 与 DA T1 DW 07H, 08H , 09H , 0AH 所预置的数据是一样的。 10. 8086CPU 的中断向量表共占有 1024个字节 (00000H -003FFH , 所以共有1024个中断。 [ ] 二、单项选择题 1. 用高级语言编写的程序(C 。 A 、只能在基本种计算机上运行 B 、无需经过编译或解释,即可被计算机直接执行 C 、具有通用性和可移植性 D 、几乎不占用内存空间 2. 一般地,我们将计算机指令的集合称为(B 。 A . 机器语言 B. 汇编语言 C. 模拟语言 D. 仿真语言

3. 我们通常所说的“裸机”指的是(C 。 A. 只装备有操作系统的计算机 B. 不带输入输出设备的计算机 C. 未装备任何软件的计算机 D. 计算机主机暴露在外 4. 计算机的软件系统一般分为(C 两大部分。 A. 系统软件和应用软件 B. 操作系统和计算机语言 C. 程序和数据 D. DOS 和 Windows 5. 计算机系统软件中的汇编程序是一种 ( C 。 A. 汇编语言程序 B. 编辑程序 C. 翻译程序 D. 将高级语言转换成汇编程序的程序 6. 假设 V1和 V2是用 DW 定义的变量,下列指令中正确的是:A A. MOV V1,20H B. MOV V1, V2 C. MOV AL,V1 D. MOV 2000H , V2 7. PC 机所使用的标准键盘向主机发送的代码是 A A . ASCII 码 B . 扫描码 C. BCD 码 D. 格雷码 8. 8086CPU 中断号为 8的中断矢量存放在(C 。 A. 0FFFFH :0008H B. 0000H :0008H C. 0000H :0020H D. 0020H :0000H 9. 已知变量 VAR 为字型,则 TYPE VAR=(B 。 A 、 1 B 、 2 C 、 3 D 、 4

汇编语言基础练习题目

、填空 1. 在8086/8088的计算机中,存储单元的20位物理地址由两部分组成,即16 位的 段地址 和16位的 偏移地址,物理地址=段地址X 10H+偏移量。 2. 段的起始地址必须是某小段的首地址,它能被 10H 整除。 3. 已知01020H 字单元的内容为6A58H 请分别写出它的两个字节单元的地址和 内容: (01020H =58H, ( 01021H =6AH 4. 指令执行后,若标志寄存器的ZF=0,则表示结果不为0;若SF=0,则表示结 果的符号是正号,即结果为正数。 5. 控制器从存储器取出一条指令后,指令指针寄存器IP 的内容是 将要执行的下 一条指令开始的偏移地址。 6. 段地址和偏移地址为1000: 127B 的存储单元的物理地址是1127BH 解:由物理地址=段地址X 10H+偏移量的公式可得 物理地址=1000HX 10H+127BH=10000H+127BH=1127BH 、选择 1. 与CS 寄存器组合才能形成代码段的物理地址的寄存器是 解:16K 个字单元,即为32K 个字节单元。由于2的15次方为32K,因此至 少需要15位二进制数才能表示16K 个字单元。 3. 已知一数据段的段地址是0100H,这个段的第6个字单元的物理地址是(B ) o 解:由于一个字单元占用两个字节,第一个字单元的偏移地址为 0000H,因 此第一个字单元的物理地址为 01000H 。以后每一个字单元的地址在前一个的基 C )。 A. SP 寄存器 B. BP 寄存器 C. IP 寄存器 D. BX 寄存器 2.如果存储器分段时, 的二进制数至少是( 一个段最多允许16K 个字单元,那么表示该段内偏移地址 A )o A.15 位 位 B.16 位 C.17 位 D.18 A. 01010H B. 0100AH C.01012H D.01006H

《汇编语言与接口专业技术》习题解答第三章

《汇编语言与接口技术》习题解答(第三章)

————————————————————————————————作者:————————————————————————————————日期:

问题: 画图说明下列语句分配的存储空间及初始化的数据值 解答: (1)byte_var DB 'ABC',10,10h,'EF',3 DUP(-1,?,3 DUP(4)) (2)word_var DW 10h,-5,3 DUP(?) 习题3.10 ‘A ’‘B ’‘C ’1010h ‘E ’‘F ’-1-444... 41h 42h 43h 0ah10h 45h 46h ffh -04h 04h 04h 3个10h 0FBh FFh ---- --10h -5?? ? 3.16 解: mov ah,1 ;只允许输入小写字母 int 21h sub al,20h ;转换为大写字母 mov dl,al mov ah,2 int 21h ;显示 3.18 解: mov ax, bufX cmp ax, bufY jge done mov ax, bufY done: mov bufZ, ax 3.19 解: .model small .stack .data bufX dw -7 signX db ? .code .startup cmp bufX,0 ;test bufX,80h

jl next ;jnz next mov signX,0 jmp done next: mov signX,-1 done: .exit 0 end 3.20 解: mov dl,’2’ mov ax,bufX cmp ax,bufY je next1 dec dl next1: cmp ax,bufZ je next2 dec dl next2: mov ah,2 int 21h 3.22 编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H 等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。 ;wjxt322.asm .model small .stack .data b_data db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h ;原始数据num equ 10 ;数据个数 sum db ? ;预留结果单元 .code .startup xor si, si ;位移量清零 xor al, al ;取第一个数 mov cx, num ;累加次数 again: add al, b_data[si] ;累加 inc si ;指向下一个数 loop again ;如未完,继续累加 mov sum, al ;完了,存结果 .exit 0 end 3.30 解: lucase proc push bx mov bx,offset string cmp al,0 je case0

汇编语言王爽第二版课后答案

第一章基础知识 检测点(第8页) ---------------------- (1) 13 (2) 1024,0,1023 (3) 8192,1024 (4) 2^30,2^20,2^10 (5) 64,1,16,4 (6) 1,1,2,2,4 (7) 512,256 (8) 二进制 注意: 1.第4题中的符号'^'指求幂运算(如: 2^30指2的30次方) 第二章寄存器(CPU工作原理) 检测点(第18页) ---------------------- (1)写出每条汇编指令执行后相关寄存器中的值。第一空:F4A3H 第二空:31A3H 第三空:3123H 第四空:6246H 第五空:826CH 第六空:6246H 第七空:826CH 第八空:04D8H 第九空:0482H 第十空:6C82H 第十一空:D882H 第十二空:D888H 第十三空:D810H 第十四空:6246H (2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。 解答如下: mov ax,2 add ax,ax add ax,ax add ax,ax 检测点(第23页) ---------------------- (1)00010H,1000FH (2)1001H,2000H 第2题说明: 因为段的起始地址要为16的倍数。所以当段地址小于1001H或大于2000H时CPU都无法寻到。 检测点(第33页) ----------------------答:CPU修改了4次IP的值。 情况如下: 第1次:执行完mov ax,bx后 第2次:执行完sub ax,ax后 第3次:读入jmp ax后 第4次:执行完jmp ax后 最后IP的值为0 实验1 查看CPU和内存,用机器指令和汇编指令编程(第33页) ----------------------------------------------------- 1.预备知识:Debug的使用 <此部分略> 2.实验任务(第43页) (1) <此部分略> (2) <此部分略> (3) 通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005~ffff:000C(共8个字节单元中)处。此生产日期不能被改变,因为其具有‘只读’属性。 (4) 通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输出到屏幕上。<注:关于显存的详细讨论不在此题范围> 第三章寄存器(内存访问) 检测点(第52页) ---------------------- (1)(题目:略) 第一空:2662H 第二空:E626H 第三空:E626H 第四空:2662H 第五空:D6E6H 第六空:FD48H 第七空:2C14H 第八空:0000H 第九空:00E6H 第十空:0000H 第十一空:0026H 第十二空:000CH 提示:此题可在DEBUG中利用E命令在本机上按照题目中所给出的内存单元及其数据进行相应地修改,然后再用A命令进行写入(题目中所给出的)相应的汇编指令,最后再进行T命令进行逐步执行,以查看相应结果。

《汇编语言与接口技术》答案习题解答(第三章)

解: mov ah,1 ;只允许输入小写字母 int 21h sub al,20h ;转换为大写字母 mov dl,al mov ah,2 int 21h ;显示 解: mov ax, bufX cmp ax, bufY jge done mov ax, bufY done: mov bufZ, ax 解:

.model small .stack .data bufX dw -7 signX db .code .startup cmp bufX,0 ;test bufX,80h jl next ;jnz next mov signX,0 jmp done next: mov signX,-1 done: .exit 0 end 解: mov dl,’2’ mov ax,bufX cmp ax,bufY je next1 dec dl next1: cmp ax,bufZ je next2 dec dl next2: mov ah,2 int 21h

编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。 ; .model small .stack .data b_data db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h ;原始数据num equ 10 ;数据个数 sum db ;预留结果单元 .code .startup xor si, si ;位移量清零 xor al, al ;取第一个数 mov cx, num ;累加次数 again: add al, b_data[si] ;累加 inc si ;指向下一个数 loop again ;如未完,继续累加 mov sum, al ;完了,存结果 .exit 0 end 解: lucase proc push bx mov bx,offset string cmp al,0 je case0 cmp al,1

汇编语言课后习题答案---郑晓薇(整理后的)

习题一 1 无符号数: 11010011=211=D3H,01110111=119=77H, 10000011=131=83H, 00101111=47=2FH, 10101010=170=AAH 带符号数:11010011= -45=D3H,01110111=+119=77H,10000011= -125=83H, 00101111=+47=2FH,10101010= -86=AAH 2 5E8AH,0BE6H,3DEH,4940H 3 00011101+00110101=01010010=5 2H=82 01001001+11101000=00110001=3 1H=49 10111110+01010010=00010000=1 0H=16 10011010+11110001=10001011=8 BH= -117 4 00101001+01010011=01111100+0 0000110=10000010=82H=82 01110011-00100100=01001111-00000110=01001001=49H=49 01100110+00011000=01111110+0 0000110=10000100=84H=84 10010+01110101=00111+0000011 0 =00111=0207H=207 5 000020A3H,FF94H,00003456H,007FH,FFFFEC00H 6 无符号数:0~65535,0000H~FFFFH;带符号数:-32768~+32767,8000H~7FFFH 7 (1) 38H等于十进制数56,是十进制数56的补码,数字8的ASCII码,十进制数38的压缩BCD码 (2) FFH等于十进制数-1,是带符号数-1的补码,无符号数为255 (3) 5AH等于十进制数90,是十进制数90的补码,大写字母Z的ASCII码 (4) 0DH等于十进制数13,是十进制数13的补码,回车符的ASCII码 8 (1) 108=01101100B=6CH,补码01101100B,压缩BCD码01000,ASCII 码313038H (2) 46=00101110B=2EH,补码00101110B,压缩BCD码01000110,ASCII码3436H (3) –15=11110001B=F1H,补码11110001B,ASCII码2D3135H (4) 254=11110B=00FEH,补码11110B,压缩BCD码10100,ASCII 码323534H 9 (1) 56+63=01110111B,CF=0,SF=0,ZF=0,OF=0 (2) 83-45=00100110B,CF=0,SF=0,ZF=0,OF=0 (3) -74+29=11010011B,CF=0, SF=1,ZF=0,OF=0 (4) -92-37=01111111B,CF=1, SF=0,ZF=0,OF=1 10 回车、换行、响铃、ESC键、空格键、、P、p 习题二 9 最少划分为16个逻辑段,最多划分为65536个逻辑段(每段16个字节) 10 CS:IP,DS:BX、SI、DI,ES:BX、SI、DI,SS:SP、BP 11 字节单元保存8位数,字单元保存16位数。根据源操作数的属性确定要访问的是字节单元还是字单元。 12 对于字节单元来说,偶地址和奇地址一样;对于字单元而言,最好用偶地址保存,可减少CPU的访存次数。 13 首单元的物理地址=38AE8H,末单元的物理地址 =38AE8H+7FFFH=40AE7H 16 (1)物理地址=27679H (2) 物理地址=20F92H (3) 物理地址=20F92H (2)和(3)的物理地址是一样的。说明逻辑地

汇编语言程序设计(第四版)第4章【课后答案】

汇编语言程序设计第四版 【课后习题答案】--囮裑為檤第4章基本汇编语言程序设计 〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。 〔解答〕 思路:首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成: .model small .stack 256 .data qvar dq 1234567887654321h .code .startup mov cx,7 mov si,1 again: mov al, byte ptr qvar[si] mov byte ptr qvar[si-1],al inc si loop again test al,80h jz ezz mov bl,0ffh jmp done ezz: mov bl,0 done: mov byte ptr qvar[7],bl .exit 0 end 〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。 〔解答〕 思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带CF 位循环左移一次(内循环共8次),外循环体控制执行7次即可。 .model small .stack 256 .data qvar dq 1234567887654321h

.code .startup mov dx, 7 ;外循环次数 mov ax, byte ptr qvar[0] ;最低位字节送ax lpp: shl ax, 1 ;最低位字节左移一次,其d7移入CF位mov si, 1 mov cx, 7 ;内循环次数 again: rcl byte ptr qvar[si], 1 ;高位字节依次左移P50 inc si loop again dec dx jnz lpp .exit 0 .end 〔习题4.3〕将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。 〔解答〕 思路:设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。仅列出代码段:mov bl, al ;将al中的两组分开 and al, 0fh ;屏蔽高四位后送al mov cl, 4 ;原al中的数据逻辑右移4次送bl shr bl, cl mov dl, ah ;将ah中的两组分开 and dl, 0f0h ;屏蔽低高四位后送dl mov cl, 4 ;原ah中的数据逻辑右移4次送dl shr dl, cl mov cl, ah ;屏蔽高四位后送cl and cl, 0fh 〔习题4.4〕编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。 〔解答〕 getkey: mov ah, 1 ;从键盘输入,出口:al存键值 int 21h cmp al, 'a' ;判键值是小写字母? jb getkay cmp al, 'z' ja getkay sub al,20h ;是小写字母转换为大写字母 mov dl,al mov ah, 02h ;显示 int 21h 〔习题4.5〕已知用于LED数码管显示的代码表为:

汇编语言程序设计实验教程第二章实验报告

汇编语言程序设计实验教程第二章 实验报告

实验2.1 用表格形式显示字符 1.题目:用表格形式显示ASCII字符SMASCII 2.实验要求: 按15行*16列的表格形式显示ASCII码为10H-100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。 3.提示: (1)显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下:mov ah,02h mov dl,输出字符的ASCII码 int 21h (2)显示空白符时,用其ASCII码0置入dl寄存器。每行结束时,用显示回车(ASCII 为0dh)和换行符(ASCII为0ah)来结束本行并开始下一行。 (3)由于逐个显示相继的ASCII字符时,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用dl寄存器,为此可使用堆栈来保存相继的ASCII字符。具体做法是:在显示空白或回车、换行符前用指令 push dx 把dl的内容保存到堆栈中去。在显示空白或回车、换行符后用指令 pop dx 恢复dl寄存器的原始内容。 4.程序清单: code segment assume cs:code start: mov dx,0010h next: mov cx,10h loop1: mov ah,02h int 21h inc dx push dx

int 21h pop dx loop loop1 push dx mov dl,0ah int 21h mov dl,0dh int 21h pop dx cmp dx,100h jb next mov ah,4ch int 21h code ends end start 5.运行结果如下: 6.实验总结: 通过本次实验我深刻的知道用汇编语言编译程序的方法,掌握了如何合理的利用各个寄存器进行程序的控制操作,初步了解到循环程序的控制方法,以及dos中断调用的基本要领对学习汇编语言有了非常好的帮助作用! 汇编语言实验二查找匹配字符串 一、目的 查找匹配字符串SEARCH

汇编语言课后习题解答

第1章基础知识 检测点1.1(第9页) (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13位。 (2)1KB的存储器有1024个存储单元,存储单元的编号从0到1023。 (3)1KB的存储器可以存储8192(2^13)个bit,1024个Byte。 (4)1GB是1073741824(2^30)个Byte、1MB是1048576(2^20)个Byte、1KB是1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64(KB)、1(MB)、16(MB)、4(GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1(B)、1(B)、2(B)、2(B)、4(B)。 (7)从内存中读取1024字节的数据,8086至少要读512次,80386至少要读256次。 (8)在存储器中,数据和程序以二进制形式存放。

(1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。 (4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。(5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU 最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。 (7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。

汇编语言程序设计(钱晓捷)课后答案

汇编语言程序设计(第二版) 钱晓捷习题答案 第二章(01) 2.1 (1)AX=1200h (2)AX=0100h (3)AX=4C2Ah (4)AX=3412h (5)AX=4C2Ah (6)AX=7856h (7)AX=65B7h 2.2(1) 两操作数类型不匹配 (2) IP指令指针禁止用户访问 (3) 立即数不允许传给段寄存器 (4) 段寄存器之间不允许传送 (5) 两操作数类型不匹配 (6) 目的操作数应为[ BP ] (7) 源操作数应为[BX+DI] (8) 立即数不能作目的操作数 2.3 lea bx,table ;获取table的首地址,BX=200H mov al,8 ;传送欲转换的数字,AL=8 xlat ;转换为格雷码,AL=12H 2.4 堆栈是一种按“先进后出”原则存取数据的存储区域。 堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。 2.5 mov ax,8057h push ax mov ax,0f79h push ax pop bx ;bx=0f79h pop [bx] ;DS:[0f79h]=8057h 2.6 AL=89h CF ZF SF OF PF AL=12h 1 0 0 1 1 AL=0afh 0 0 1 0 1 AL=0afh 1 0 1 0 1 AL=00h 0 1 0 0 1 AL=0ffh 0 0 1 0 1 AL=00h 0 1 0 0 1 2.7 W=X+Y+24-Z

2.8 (1)ADD DX,BX (2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX (4)ADD WORD PTR [0520H],3412H (5)ADD AL,0A0H 2.9;为了避免与操作数地址混淆,将题中X,Y,Z,V 字操作数改为A,B,C,D mov ax,X ;ax=A imul Y ;dx,ax = A*B (将操作数看作符号数,以下同) mov cx,ax mov bx,dx ;bx,ax <-- dx,ax =A*B mov ax,Z ;ax = C cwd ;dx,ax =C (扩展符号后为双字) add cx,ax adc bx,dx ;bx,cx <-- bx,cx+dx,ax=A*B+C sub cx,540 sbb bx,0 ;bx,cx<-- A*B+C-540 mov ax, V ;ax= D cwd ;dx,ax= D (扩展符号后为双字) sub ax, cx sbb dx, bx ;dx,ax = dx,ax - bx,cx = D-(A*B+C-540) idiv X ;运算结果:[D-(A*B+C-540h)]/A ;ax存商,dx存余数 2.10;(1)xchg的操作数不能是立即数 (2不能对CS直接赋值 (3)两个操作数不能都是存储单元 (4)堆栈的操作数不能是字节量 (5)adc的操作数不能是段寄存器 (6)没有确定是字节还是字操作 (7)in不支持超过FFH的直接寻址 (8)out只能以AL/AX为源操作数 第二章(02) 2.11; 指令AX的值CF OF SF ZF PF Mov ax,1407h1470h----- And ax,ax1470h00000 Or ax,ax1470h00000 Xor ax,ax000011 Not ax0ffffh----- Test ax,0f0f0h0ffffh00101 注意: 1. mov, not指令不影响标志位 2. 其他逻辑指令使CF=OF=0, 根据结果影响其他标志位。

汇编语言程序设计(第四版)第1_4章【课后答案】

汇编语言程序设计第四版 【课后习题答案】 第1章汇编语言基础知识 〔习题1.1〕简述计算机系统的硬件组成及各部分作用。 〔解答〕 CPU:包括运算器、控制器和寄存器组。运算器执行所有的算术和逻辑运算;控制器负责把指指令逐条从存储器中取出,经译码分析后向机器发出各种控制命令,并正确完成程序所要求的功能;寄存器组为处理单元提供所需要的数据。 存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。 外部设备:实现人机交换和机间的通信。 〔习题1.2〕明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB。 〔解答〕 主存又称内存是主存储器的简称,主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低、容量大,但速度慢。 RAM是随机存取存储器的英语简写,由于CPU可以从RAM读信息,也可以向RAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器可以按地址随机读写,但这类存储器在断电后不能保存信息;而ROM中的信息只能被读出,不能被修改,ROM型半导体通常只能被读出,但这类存储器断电

后能保存信息。 存储器由大量存储单元组成。为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常称做I/O端口。 KB是千字节、MB是兆字节、GB是吉字节和TB是太字节,它们都是表示存储器存储单元的单位。 〔习题1.3〕什么是汇编语言源程序、汇编程序、目标程序? 〔解答〕 用汇编语言书写的程序就称为汇编语言源程序;完成汇编工作的程序就是汇编程序;由汇编程序编译通过的程序就是目标程序。 〔习题1.4〕汇编语言与高级语言相比有什么优缺点? 〔解答〕 汇编语言与高级语言相比的优点:由于汇编语言本质就是机器语言,它可以直接地、有效地控制计算机硬件,因而容易产生运行速度快,指令序列短小的高效目标程序,可以直接控制计算机硬件部件,可以编写在“时间”和“空间”两方面最有效的程序。 汇编语言与高级语言相比的缺点:由于与处理器密切相关导致通用性差、可移植性差,汇编语言功能有限,又涉及寄存器、主存单元等硬件细节,编写汇编语言比较繁琐,调试起来也比较困难,编译程序产生的目标程序往往比较庞大、程序难以优化,运行速度慢。 〔习题1.5〕将下列十六进制数转换为二进制和十进制表示 (1)FFH (2)0H (3)5EH

汇编语言第三章答案

给定(BX)=637DH,(SI)=2A9BH,位移量D=7237H,试确定在以下各种寻址方式下的有效地址是什么 (1) 立即寻址 (2) 直接寻址 (3) 使用BX的寄存器寻址 (4) 使用BX的简接寻址 (5) 使用BX的寄存器相对寻址 (6) 基址变址寻址 (7) 相对基址变址寻址 答:(1) 操作数在指令中,即立即数; (2) EA=D=7237H; (3) 无EA,操作数为(BX)=637DH; (4) EA=(BX)=637DH; (5) EA=(BX)+D=0D5B4H; (6) EA=(BX)+(SI)=8E18H; (7) EA=(BX)+(SI)+D=1004FH;超过了段的边界,最高进位位丢失,因此EA=004FH。 试根据以下要求写出相应的汇编语言指令 (1) 把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器中。 (2) 用寄存器BX和SI的基址变址寻址方式把存储器中的一个字节与AL寄存器的内容相加,并把结果送到AL寄存器中。 (3) 用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和(CX)相加,并把结果送回存储器中。 (4) 用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回存储单元中。 (5) 把数0B5H与(AL)相加,并把结果送回AL中。 答:(1) ADD DX, BX (2) ADD AL, [BX][SI] (3) ADD [BX+0B2H], CX (4) ADD WORD PTR [0524H], 2A59H (5) ADD AL, 0B5H 写出把首地址为BLOCK的字数组的第6个字送到DX寄存器的指令。要求使用以下几种寻址方式: (1) 寄存器间接寻址 (2) 寄存器相对寻址 (3) 基址变址寻址 答:(1) MOV BX, OFFSET BLOCK ADD BX, (6–1)*2 MOV DX, [BX] (2) MOV BX, OFFSET BLOCK 改为:MOV BX, (6-1)*2 MOV DX, [BX+(6–1)*2] 也可MOV DX, BLOCK[BX] (3) MOV BX, OFFSET BLOCK MOV SI, (6–1)*2 MOV DX, [BX][SI] 现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,

汇编语言习题-测验题答案

汇编语言各章习题、测试题答案 习题一 分别将下列二进制数作为无符号数和带符号数转换为十进制和十六进制数 01110111 00101111 十六进制运算 1A52H+4438H 3967H-2D81H 37H×12H 1250H×4H 将十进制数变为8位补码并做运算(结果用二进制、十六进制、十进制表示) 29+53 73-24 -66+82 -102-15 用压缩BCD码计算(结果用二进制、BCD码、十进制表示) 29+53 73-24 66+18 132+75 符号位扩展(字节扩展为字,字扩展为双字) 20A3H 94H 3456H 7FH EC00H 若机器字长为16位,其无符号数表示范围是多少带符号数表示范围是多少分别用十进制和十六进制表示。 写出下列十六进制数所能代表的数值或编码: (1)38H (2)FFH (3)5AH (4)0DH 将下列十进制数分别转换为二进制、十六进制、二进制补码、压缩BCD码和ASCII码: (1)108 (2)46 (3)-15 (4)254 写出下列算式的8位二进制运算结果,标志位CF、SF、ZF、OF分别是什么值 (1)56+63 (2)83-45 (3)-74+29 (4)-12-37 查表,指出ASCII码0DH、0AH、07H、1BH、20H、60H、50H、70H对应的控制字符。 测验一 单选题: 1.已知X=76,则[X]补= 。 A. 76H B. 4CH 2.已知[X]补=80H,则X= 。 A. 80H B. 0 C. 0FFH D. -80H 3.已知[X]补=98H,则[X]补/2= 。 A. 0CCH C. 49H D. 31H 4.已知X=78,Y=-83,则[X+Y]补= 。 A. 0F5H B. 0A1H C. 0FBH D. 65H 5.将124转换成十六进制数的结果是 A. 7CH B. 7DH C. 7EH D. 7BH 6.将93H看成一个压缩BCD码,其结果是 A. B. C. D. 7. 45转换成二进制数是 A. C. 00101101 D. 8.6CH转换成十进制数是 A. 118 B. 108 C. 48 D. 68 9.将93H扩展为字的结果是 A. FF93H B. 0093H C. 1193H D. 1093H

第4章习题 汇编语言程序设计(单片机第二版)

第四章习题与参考答案 4.1程序设计语言有哪三种?各有什么异同?汇编语言有哪两类语言?各有什么特点? 4.2在汇编语言程序设计中,为什么要采用标号来表示地址?标号的构成原则是什么?使用标号有什么限制?注释段起什么作用? 4.3MCS-51汇编语言有哪几条常用伪指令?各起什么作用?

4.4汇编语言程序设计分哪几步?各步骤的任务是什么? 4.5汇编语言源程序的机器汇编过程是什么?第二次汇编的任务是什么? 4.6请用除法指令编写例4.2的程序,并计算所占内存字节数和所需机器周期数。 4.7设内部RAM20H单元有两个非零的BCD数,请编写求两个BCD数的积并把积送入21H单元的程序。 4.8已知,从内部RAM BLOCK单元开始存放有一组带符号数,数的个数存放在LED单元。请编写

可以统计其中正数和负数个数并分别存入NUM和NUM+1单元的程序。 4.9设自变量X为一无符号数,存放在内部RAM的VAX单元,函数Y存放在FUNC单元。请编写满足如下关系的程序: X>=50时:Y=X; 50>X>=20时:Y=5X; X<20时:Y=2X;

4.10在例4.6的128分支程序中,若用LJMP指令代替AJMP指令,以便分支程序可以放在64KB地址范围的任务位置。请修改原程序,修改后的程序最多可实现多少个分支? 4.11从外部RAM的SOUCE(二进制8位)开始有一数据块,该数据块以$字符结尾。请编写程序,

把它们传送到以内部RAM的DIST为起始地址的区域($字符也要传送)。 4.12在例4.11中,若SOUCE为二进制16位,则程序又该如何编。 4.13在外部RAM的低256地址单元区,有起始地址为SOUCE且长度存放在LEN单元的数据块。请编写能对它们进行奇偶校验的程序。凡满足奇校验(奇数个1)的数据均送到内部RAM起始地址为DIST 的存储区。

汇编语言程序设计(第二版) 钱晓捷 课后答案

汇编语言程序设计(第二版)钱晓捷习题答案 第二章(01) 2.1 (1)AX=1200h (2)AX=0100h (3)AX=4C2Ah (4)AX=3412h (5)AX=4C2Ah (6)AX=7856h (7)AX=65B7h 2.2 (1) 两操作数类型不匹配 (2) IP指令指针禁止用户访问 (3) 立即数不允许传给段寄存器 (4) 段寄存器之间不允许传送 (5) 两操作数类型不匹配 (6) 目的操作数应为[ BP ] (7) 源操作数应为[BX+DI] (8) 立即数不能作目的操作数 2.3 lea bx,table ;获取table的首地址,BX=200H mov al,8 ;传送欲转换的数字,AL=8 xlat ;转换为格雷码,AL=12H 2.4 mov ax,8057h push ax mov ax,0f79h push ax pop bx ;bx=0f79h pop [bx] ;DS:[0f79h]=8057h 2.6 AL=89h CF ZF SF OF PF AL=12h 1 0 0 1 1 AL=0afh 0 0 1 0 1 AL=0afh 1 0 1 0 1 AL=00h 0 1 0 0 1 AL=0ffh 0 0 1 0 1 AL=00h 0 1 0 0 1 2.5 堆栈是一种按“先进后出”原则存取数据的存储区域。 堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。 2.7 W=X+Y+24-Z 2.8 (1)ADD DX,BX (2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX (4)ADD WORD PTR [0520H],3412H (5)ADD AL,0A0H 2.9;为了避免与操作数地址混淆,将题中X,Y,Z,V 字操作数改为A,B,C,D mov ax,X ;ax=A imul Y ;dx,ax = A*B (将操作数看作符号数,以下同) mov cx,ax mov bx,dx ;bx,ax <-- dx,ax =A*B mov ax,Z ;ax = C cwd ;dx,ax =C (扩展符号后为双字) add cx,ax

mcs-51第四章答案 汇编语言程序设计

第四章汇编语言程序设计 1 题若晶振为12MHz,试编制延时2ms和1s子程序。 答:延时2ms: DELY: MOV R7, #10 DLY0: MOV R6, #98 NOP DLY1: DJNZ R6, DLY1 DJNZ R7, DLY0 RET 延时1s: DELY: MOV R0, #50 LP11: MOV R1, #100 LP22: MOV R2, #100 LP33: DJNZ R2, LP33 DJNZ R1, LP22 DJNZ R0, LP11 RET 4 题试求20H和21H单元中16位带符号二进制补码数的绝对值,并送回20H和21H单元,高位在先,低位在后。 答:方法一: 先判断符号位,若为0则不作任何处理(因为正数的补码数与原数相同,而0的补码数就是0)。若符号位为1,则用0减去该数即可。编程如下: ORG 1000H MOV A, 20H JNB ACC.7, DONE CLR C CLR A SUBB A, 21H MOV 21H, A CLR A SUBB A, 20H MOV 20H, A DONE: SJMP $ END 方法二:可用变反加“1”来完成。

ORG 1000H MOV A, 20H JNB ACC.7, DONE CPL A MOV 20H, A MOV A, 21H CPL A MOV 21H, A CLR C MOV A, 21H ADD A, #1 MOV 21H, A MOV A, 20H ADDC A, #0 MOV 20H, A DONE: SJMP $ END 5题试求内部RAM 30~37H单元8个无符号数的算术平均值,结果存入38H单元。 答:方法一:相加后和放在R3:38H中,然后将结果整体右移3位,得数放在38H单元中。 ORG 1000H START: MOV R7, #07H MOV R3, #00H MOV A, 30H MOV R0, #31H LOOP: ADD A, @R0 JNC NEXT INC R3 NEXT: INC R0 DJNZ R7, LOOP MOV 38H, A MOV R7, #3 LOOP1: CLR C MOV A, R3 RRC A MOV R3, A

相关文档
最新文档