程序

更新时间:2024-01-24 01:46:01 阅读量: 教育文库 文档下载

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

1、f(X)= 5X + 4X - 3X + 2 ,要求编制程序计算自变量X=5时函数f(X)的值。

DATA SEGMENT X DW 5 RESULT DW ? DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX MOV AX,5 MUL X MUL X MUL X

;5*X ;5*X+4 ;(5*X+4)X ;(5*X+4)X-3 ;((5*X+4)X-3)X ;((5*X+4)X-3)X+2

;保存运算结果

ADD AX,4 SUB AX,3 ADD AX,2 MOV AH,4CH INT 21H

CODE ENDS

END START

;返回DOS

;装填数据段

32

MOV RESULT,AX

2、 比较两个无符号数的大小。

DATA SEGMENT A DB 20H B

DB 92H

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX MOV AL,A CMP B,AL JA BGA

;取数送AL ;比较二数 ;若B> A转BGA

;准备显示A> B

MOV DL,‘A’ MOV BL,‘B’

BGA: MOV DL,‘B’

MOV BL,‘A’

JMP DISP

;准备显示B> A

DISP: MOV AH,2

INT 21H

MOV DL,‘>’ INT 21H MOV DL,BL INT 21H

;显示比较结果

MOV AH,4CH INT 21H

;返回DOS

CODE ENDS

END START

3、 某应用程序主菜单有8个可选项,其入口地址分别记为R0、R1 ?R7。要求编制程序根据变量N的值转向相应的处理程序(N为入口编号)。

DATA BASE N

SEGMENT DW DB 5 ENDS SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX MOV AL,N ADD AL,AL MOV AH,0

MOV BX,OFFSET BASE ADD BX,AX JMP AX

R0:

┇ ┇

JMP OK

R1:

;R1的处理程序

JMP OK

MOV AX,[BX]

;跳转表首地址送BX ;得到Rn的存放地址 ;入口地址送AX ;跳转到相应的处理程序 ;R0的处理程序

;入口编号N送AL ;2×N →AL

R0,R1,R2,R3

DW R4,R5,R6,R7

DATA CODE

;R7的处理程序 ;返回DOS操作系统

MOV AH,4CH INT 21H

R7: OK:

CODE ENDS

END START

4、从BUF单元开始存有20个8位带符号数,要求统计其中的负数个数放在NEGA字节单元,并显示在CRT上(设负数个数在0~9之间)。

DATA BUF COUNT NEGA DATA CODE

SEGMENT

DB 2,-1,56,-38,4,┅ EQU 20

DB ? ENDS SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV

DS,AX

BUF

;置数据指针SI

MOV SI,OFFSET

MOV

LP:

DL,0

;计数器清零

MOV CX,COUNT MOV AL,[SI] AND

JNS NEXT INC DL

NEXT:

INC SI LOOP LP

AL,AL

;置循环次数 ;取数送AL

;置标志位

;为正,转NEXT ;为负,计数器加1 ;修改指针 ;未完,继续 ;存结果 ;转换成ASCII码

;显示这组数中负数的个数 ;返回DOS

MOV NEGA,DL OR DL,30H MOV MOV

CODE

ENDS

END START INT 21H INT 21H

AH,2 AH,4CH

5、已知在内存中从STR单元开始放有一串字符,以‘$’作为结束标志,长度不超过

100字节,要求统计该字符串的长度,并存于LEN单元。

DATA STR LEN DATA STACK STT STACK CODE

SEGMENT

DB ‘ABCDJKLLHH┅$’ DB 0 ENDS SEGMENT ENDS SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START: MOV AX,DATA

MOV MOV MOV

DS,AX AX,STACK SS,AX

;字符串首址送DI

;结束标志送AL ;将串中字符与结束标志比较 ;是‘$’字符,转STOP

;不是‘$’字符,串长计数器加1 ;修改地址指针 ;继续循环 ;返回DOS

PARA STACK

‘STACK’

DB 100 DUP(?)

MOV SP,SIZE STT LEA DI,STR MOV

LP:

AL,‘$’

CMP AL,[DI]

JZ STOP INC LEN INC DI JMP LP

STOP: CODE

MOV ENDS

END START INT 21H

AH,4CH

6、:将内存区域中的两个单字节数相加,结果送第3字节,并将结果转换成十进制数送CRT显示(假设结果小于100)。

DATA LIST DATA CODE

SEGMENT DB 16,48,? ENDS SEGNENT

ASSUME CS:CODE,DS:DATA

START: MOV

AX,DATA MOV

DS,AX

CALL ADSUB CALL OUTPR MOV

AH,4CH

INT 21H

ADSUB

PROC

MOV AL,LIST

ADD AL,LIST+1 MOV LIST+2,AL

RET

ADSUB ENDP DISPL

PROC

OR DL,30H MOV AH,2

INT 21H

RET

DISPL ENDP OUTPR

PROC

MOV AL,LIST+2 MOV AH,0 MOV BL,10

DIV BL

MOV DL,AL MOV BH, AH

CALL DISPL MOV DL,BH

CALL DISPL

RET

OUTPR ENDP CODE

ENDS END START

;两数相加并存放结果

;显示结果

;返回DOS ;取数送AL ;两数相加

;存结果 ;显示DL中的字符

;取数送AL

;AH清零

;高位送DL ;低位送BH保存

;显示高位

;显示低位

7、有两个多字节的压缩型十进制数分别存于从A和B单元开始的数据区中,试将其相加并将十进制结果存于从C单元开始的数据区中。设压缩型十进制数长度为10个字节,被加数、加数和结果的低字节均存于低地址单元。

DATA A B C N

SEGMENT

DB 12H,38H,63H,? DB 10 DUP(?) EQU 10 ENDS SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV

MOV MOV MOV MOV MOV CLC

NEXT: MOV AL,[SI]

ADC DAA INC SI INC DI INC BX LOOP NEXT MOV

CODE ENDS

END START INT 21H

;调整地址指针 ;未完,继续

;取被加数一个字节

;与加数对应字节相加 ;十进制调整

AL,[DI] AX,DATA DS,AX

SI,OFFSET A DI,OFFSET B CX,N

BX,OFFSET C

;置被加数的地址指针 ;置加数的地址指针 ;置结果地址指针

;10个被加数 ;结果单元

;运算数据的字节数

DB 88H,27H,42H,? ;10个加数

DATA CODE

MOV [BX],AL ;存结果

AH,4CH

8、已知从DATA1单元开始存有10个字节的压缩BCD码,要求编程将其转为ASCII

码并显示在CRT上。

DATA DATA1 N

SEGMENT

DB 34H,68H,76H,?

EQU $-DATA1 ;$代表当前地址,减去DATA1地址即为10。 SEGMENT PARA STACK ‘STACK’ DB 100 DUP (?) ENDS

ASSUME CS:CODE,DS:DATA,SS:STACK

START: MOV AX,DATA

MOV

DS,AX

MOV AX,STACK

DATA ENDS STACK STA STACK

CODE SEGMENT

MOV

CODE ENDS

AH,4CH

;返回DOS ;代码段结束 ;源程序结束

INT 21H

END START

(2) 求AH与AL中数的和,将结果转换成ASCII码,然后在屏幕上显示出来。程序代

码如下:

CODE SEGMENT

;保存AX中的数据 ;移位次数

;千位移到AH低4位 ;转换成ASCII码 ;代码段开始

ASSUME CS:CODE

START: MOV BX,AX

MOV CL,4 SHR AH,CL ADD AH,30H MOV DL,AH MOV AH,2 INT 21H

;调用2号系统功能,输出单字符 ;取低4位 ;转换成ASCII码

MOV AH,BH AND AH,0FH ADD AH,30H MOV DL,AH MOV AH,2 INT 21H

;调用2号系统功能,输出单字符 ;移位次数

;十位移到低4位 ;转换成ASCII码

MOV AL,BL MOV CL,4 SHR AL,CL ADD AL,30H MOV DL,AL MOV AH,2 INT 21H

;调用2号系统功能,输出单字符 ;取低4位 ;转换成ASCII码

MOV AL,BL AND AL,0FH ADD AL,30H MOV DL,AL MOV AH,2 INT 21H MOV

CODE

ENDS INT 21H

;调用2号系统功能,输出单字符 ;返回DOS ;代码段结束 ;源程序结束

AH,4CH

END START

16、已知从BUF单元开始存放着10个8位无符号数,要求编写汇编语言程序将这10个数

去掉一个最大的,再去掉一个最小的,将其余的数的算术平均值计算出来并存于AVERG单字节单元。

【解】注意:10个8位无符号数的累加和有可能超过8位,需要16位的寄存器存储。寄存器分配:DL:最小值;DH:最大值;CX:循环次数;AX:累加和。

本题的思路:找出最小值,暂时存于DL,找出最大值,暂时存于DH,求10个数的和,

再减去最小值和最大值,求8个数的平均值。

程序代码如下:

DATA BUF AVERG DATA CODE

SEGMENT DB ? ENDS

;数据段结束

;代码段开始

SEGMENT

;数据段开始

DB 23H,26H,44H,98H,32H,72H,39H,62H,75H,48H

ASSUME CS:CODE,DS:DATA

START: MOV

MOV

AX,DATA DS,AX

;装填数据段 ;传送变量的地址

LEA BX,BUF XOR AX,AX MOV CX,9 MOV DL,[BX] MOV DH,[BX] MOV AL,[BX]

LP1: INC BX

CMP DL,[BX] JBE CONT1 MOV DL,[BX]

CONT1: CMP DH,[BX]

JAE CONT2 MOV DX,[BX]

CONT2: ADD AL,[BX]

ADC

AH,0

LOOP LP1 SUB AL,DL SBB AH,0 SUB AL,DH SBB AH,0 MOV BL,8 DIV BL MOV

CODE

ENDS

;if DL>[BX], then DL←[BX] ;if DL<=[BX], 转移 ;if DH<[BX], then DH←[BX] ;if DL>=[BX], 转移

;平均值在AL中

MOV AVERG,AL

AH,4CH

;返回DOS ;代码段结束 ;源程序结束

INT 21H

END START

17、从TABLE字节单元开始存有100个无符号数,试编程把数组中出现次数最多的数存入CH中,其出现次数存入CL中。 【解】程序代码如下:

DATA TABLE DATA CODE

SEGMENT ENDS

;数据段开始

DB 100 DUP(?)

;数据段结束

;代码段开始

SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV

MOV

AX,DATA DS,AX

;装填数据段 ;传送变量的地址

LEA BX,TABLE XOR AX,AX XOR DX,DX MOV

LP2:

CX,99

PUSH BX PUSH CX MOV LP1:

AH,[BX] INC BX

MOV AL,1 CMP AH,[BX] JNE NEXT1 INC AL

NEXT1: LOOP LP1

POP CX POP BX INC BX CMP AL,DL JB NEXT2 MOV DL,AL MOV DH,AH

NEXT2: LOOP LP2

MOV CX,DX MOV

CODE

ENDS

AH,4CH

INT 21H

;AH !=[BX],转移

;AL

;返回DOS ;代码段结束 ;源程序结束

END START

18、 有两个长度不等的字符串,分别存于STRN1和STRN2单元开始的存储区,字串长度分别存放于LS1和LS2字节单元,要求编程将短串接在长串之后,并将连接后的串长度存于LS1和LS1+1单元。

【解】设两串连接后最大长度为256个字符,连接后的字符串存于STRN3单元开始的存储区。程序代码如下:

DATA STRN1 STRN2 STRN3

SEGMENT

;数据段开始

DB ‘i swear by the moon and the stars in the sky.’ DB ‘and i swear like the shadow thats by your side. ’ DB 256 DUP(?)

LS1 DB 45 LS2 DB 48 DATA

ENDS

;数据段结束 ;代码段开始

CODE SEGMENT START: MOV

ASSUME CS:CODE,DS:DATA

AX,DATA

MOV DS,AX XOR AX,AX XOR BX,BX MOV AL,LS1 MOV BL,LS2 CMP AL,BL JA LINK2

LINK1: LEA BX,STRN2

LEA SI,STRN3

XOR CX,CX MOV CL,LS2

LOP1:

MOV AL,[BX] MOV [SI],AL INC BX INC SI LOOP LOP1 LEA BX,STRN1

MOV CL,LS1

LOP2:

MOV AL,[BX] MOV [SI],AL INC BX INC SI LOOP LOP2 JMP NEXT

LINK2: LEA BX,STRN1

LEA SI,STRN3

XOR CX,CX MOV CL,LS1

LOP3:

MOV AL,[BX] MOV [SI],AL INC BX INC SI LOOP LOP3 LEA BX,STRN2

MOV CL,LS2

LOP4:

MOV AL,[BX] MOV [SI],AL INC BX INC SI LOOP LOP4

NEXT:

XOR AX,AX XOR BX,BX MOV AL,LS1 MOV BL,LS2

;装填数据段

;AL>BL,大数在LS1中,转移到LINK2 ;传送变量的地址 ;传送变量的地址

;传送变量的地址

;传送变量的地址 ;传送变量的地址 ;传送变量的地址 ADD AX,BX LEA BX,LS1 MOV [BX],AX

STOP:

MOV

AH,4CH

;返回DOS ;代码段结束 ;源程序结束

INT 21H

CODE ENDS

;将连接后的串长度存于LS1和LS1+1单元。

END START

19、从BUF字节单元开始存有按增序排好顺序的一个带符号数组,数组长度在LEN字节单元。在POSI字节单元存有一个正数,要求将其按顺序插入到数组中,并修改数组长度。

【解】程序代码如下:

DATA SEGMENT BUF

LEN DB ? POSI DB 32 DATA

ENDS

;数据段结束 ;代码段开始

CODE SEGMENT START: MOV

MOV

;数据段开始

DB -33,-29,-6,-4, 4,21,33, 34, 34,49……

ASSUME CS:CODE,DS:DATA

AX,DATA DS,AX

;装填数据段 ;传送变量的地址

LEA BX,BUF XOR CX,CX MOV CL,LEN MOV AH,POSI

LP1: MOV AL,[BX]

CMP AH,AL JL NEXT INC BX LOOP LP1

;AH < AL,转移

MOV [BX],AH JMP STOP

NEXT: LP2:

ADD BX,CX MOV AL,[BX] MOV [BX+1],AL DEC BX LOOP LP2 MOV [BX],AH

STOP:

MOV AL,LEN INC AL

MOV LEN,AL MOV

CODE ENDS

AH,4CH

INT 21H

;新数据插入到数组尾 ;指针移向数组尾

;插入新数据

;修改数组长度 ;返回DOS ;代码段结束 ;源程序结束

END START

20、假设DX=36A5H,CL=3,CF=1,确定下列各条指令执行后DX和CF的值。

(1) SHR DX,1 (2) SAR DX,CL (3) SHL DX,CL (4) SHL DL,1 (5) ROR DX,CL (6) ROL DL,CL (7) SAL DH,1 (8) SAR DH,CL (9) RCL DX,CL (10)RCR DX,CL 【解】

(1) 指令执行后DX:1B52H,CF:1 (2) 指令执行后DX:06D4H,CF:1 (3) 指令执行后DX:6D4AH,CF:0 (4) 指令执行后DX:364AH,CF:1 (5) 指令执行后DX:0C6D4H,CF:1 (6) 指令执行后DX:362DH,CF:1 (7) 指令执行后DX:6CA5H,CF:0 (8) 指令执行后DX:06A5H,CF:1 (9) 指令执行后DX:0B529H,CF:1 (10) 指令执行后DX:0A6D4H,CF:1

21、编写程序段将寄存器AL中的8位二进制数的内容颠倒过来,即将原来的最高位变为最低位,次高位变为次低位,以此类推,若原AL的内容为01110001B,则颠倒之后变为10001110B。

【解】程序段如下:

XOR AH,AH MOV CX,8

LP1: SHR AL,1

RCL AH,1 LOOP LP1 MOV AL,AH

;存回AL

;AH清零 ;重复8次

;逻辑右移,将最最低位移入CF

;带进位的循环左移,将CF移入AH的最低位

22、 用串操作指令将100H个字符从2100H处搬到1000H处,并且从中检索与AL中所存字符相同的存储单元,并将该单元的内容替换成空格,本程序只替换检索到的第一个相同的单元。请在下列空格中填入合适的指令,使程序段完成上述功能。

MOV SI,2100H (1) MOV CX,100H CLD

(2) MOV DI,1000H MOV CX,100H (3) JNZ K1 (4) MOV [DI],20H K1: ┇

【解】

(1) MOV DI,1000H (2) REP MOVSB (3) REPNE SCASB (4) DEC DI

23、编程求出AX中存放的16位二进制数中‘1’的个数,将其存入CL中(若AX=1001010011001011B则将8存入CL)。 【解】程序段如下:

MOV CX,16 XOR BX,BX

L1: SHL AX,1

RCL BL,1 ADD BH,BL XOR BL,BL LOOP L1 MOV CL,BH

;最低位移入CF ;CF移入最低位

24、 已知BUF单元有一个单字节无符号数X,按要求编写一程序段计算Y(仍为单字节数),并将其存于累加器。

3X,X<20

Y= X-20,X≥20

【解】程序段如下:

XOR AX,AX MOV AL,BUF CMP AL,20 JNB L1 MOV BL,3 MUL BL JMP END

L1: SUB AX,20 END: HLT

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

Top