汇编语言小程序例子

更新时间:2024-04-13 14:48:01 阅读量: 综合文库 文档下载

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

1.编写统计AX中1、0个数的源程序。1的个数存入CH,0的个数存入CL。

CODE SEGMENT

ASSUME CS:CODE

START: MOV CX, 0

MOV DX,17

AA1: SUB DX, 1

JZ AA3

SHL AX, 1

JNC AA2

INC CH

JMP AA1

AA2: INC CL

JMP AA1

AA3: MOV AH,4CH

INT 21H

CODE ENDS

END START

2.编写比较两个字符串STRING1和STRING2所含字符是否完全相同的源程序,若相同则显示“MATCH”,若不相同则显示“NO MATCH”。

程序:

DATA SEGMENT

R1 DB 'MATCH',0AH,0DH

R2 DB 'NO MATCH',0AH,0DH

STRING1 DB 'XXXXX'

N1 EQU $-STRING1

STRING2 DB 'YYYYY'

N2 EQU $-STRING2

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AX,N1

CMP AX,N2

JNZ AA1

ADD AX,1

LEA SI,STRING1

LEA DI,STRING2

AA2: MOV BL,[SI]

MOV BH,[DI]

INC SI

INC DI

SUB AX,1

JZ AA3

CMP BL,BH

JZ AA2

JMP AA1

AA3: LEA BX,R1

MOV CX,7

AA4: MOV DL,[BX]

INC BX

MOV AH,2

INT 21H

LOOP AA4

JMP E

AA1: LEA BX,R2

MOV CX,10

AA5: MOV DL,[BX]

INC BX

MOV AH,2

INT 21H

LOOP AA5

E: MOV AH,4CH

INT 21H

CODE ENDS

END START

3.从键盘读入一个四位的十六进制数,CRT显示等值的二进制数.

由于每个十六进制数位对应4个二进制,所以每读入一个十六进制位后,即可将其对应的4个二进制位依次输出。由于数字‘0’~ ‘9’的ASCⅡ码为30H~39H,字母‘a’~‘f’与 ‘A’~‘F’的ASCⅡ码为61H~66H 与41H~46H ,因此,如果输入的字母为数字‘0’~‘9’,则其低4位即为对应的二进制位;如果输入的字符为字母‘a’~‘f’或‘A’~‘F’,则需要减7,然后通过移位将低4位依次输出。

汇编程序如下:

DATA SEGMENT

MSG1 DB 'Hex:', '$'

MSG2 DB 0DH, 0AH, 'Binary:', '$'

COUNT EQU 4

BUF DB 4 DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX, DATA

MOV DS, AX

LEA DX, MSG1

MOV AH, 9

INT 21H

MOV CX, COUNT

MOV SI, 0

INPUT: ;通过四次循环从键盘读入四位十六进制数

MOV AH, 1

INT 21H

MOV BUF[SI], AL

DEC CX

INC SI

CMP CX, 0

JNZ INPUT

NEXT3: LEA DX, MSG2

MOV AH, 9

INT 21H

MOV CX, COUNT

MOV SI, 0

NEXT2: MOV BL, BUF[SI]

CMP BL , '9'

JBE OK ; 读入的字符<=9 转向 OK:

SHR DL,1

SHR DL,1

SHR DL,1

SHR DL,1

AND DL,0FH

CMP DL,10

JB L4

ADD DL,7 L4:

ADD DL,30H ;

MOV AH,2

INT 21H

MOV DL,BL

AND DL,0FH

CMP DL,10

JB L6

ADD DL,7 L6:

ADD DL,30H ;

MOV AH,2

INT 21H

MOV DL,'H' ;

显示高四位对应的十六进制的ascii码 显示低四位对应的十六进制的ascii码 显示H MOV AH,2

INT 21H L:

MOV AH,4CH ;返回DOS

INT 21H

CODE ENDS

END START

6. 已知数据块BUFA中存放15个互不相等的字节数据,BUFB中存放20个互不相等的字节数据,试编写将既在BUFA中出现,又在BUFB中出现的数据存放到BUFC开始的缓冲区中的源程序。 答:

DATA SEGMENT

BUFA DB 41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH,4CH,4DH,4EH,4FH

BUFB DB 31H,32H,33H,41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,4BH,4CH

DB 50H,51H,52H,53H,54H

BUFC DB 15 DUP (0)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

LEA SI,BUFA

LEA BX,BUFC

MOV CX,15 ;外层循环计数

AA1: MOV AH,20 ;内层循环20次

MOV AL,[SI]

LEA DI,BUFB

AA2: CMP AL,[DI]

JNZ AA3

MOV [BX],AL

INC BX

JMP AA4

AA3: INC DI

DEC AH

JNZ AA2

AA4: INC SI

LOOP AA1

MOV CX,15

LEA BX,BUFC

BB1: MOV DL,[BX]

INC BX

MOV AH,2

INT 21H

:比较BUFA , BUFB内容 ;内容不同,跳至AA3 ;内容相同,将其存入BUFC单元 ;找到相同内容,结束本次内层循环 ;内层循环计数减一 ;内层循环结束 ;外层循环结束 ;此行以下将BUFC中的内容输出 LOOP BB1

MOV AH,4CH

INT 21H

CODE ENDS

END START

7.试编写由键盘输入一个以回车作为结束的字符串,将其按ASCII码由大到小的顺序输入到CRT上的源程序。 答:

DATA SEGMENT;数据段

BUF DB 200 DUP(?)

DATA ENDS

CODE SEGMENT;代码段

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV DI,0;记录输入的字符串个数

MOV BX,OFFSET BUF

AA1: MOV AH,1;键盘输入字符

INT 21H

CMP DI,201;是否超出缓冲区

JNC AA6 ;超过缓冲区大小

CMP AL,0DH;是否为回车,回车表输入结束

JZ AA6;是回车

MOV [BX],AL;将字符存入缓冲区

INC BX

INC DI

JMP AA1

AA6: MOV DX,DI

CMP DI,0;没有字符则无输出

JZ AA7

CMP DI,1;有一个字符则直接输出

JZ AA8

DEC DX;外循环计数初值,即遍数,数据个数减1

AA2: MOV BX,OFFSET BUF

MOV CX,DI

DEC CX;内循环计数初值,即比较次数,数据个数减1

AA3: MOV AL,[BX]

CMP AL,[BX+1];比较

JNC AA4;前大后小转

XCHG AL,[BX+1];前小后大交换

MOV [BX],AL

AA4: INC BX

LOOP AA3

DEC DX

JNZ AA2

AA8: MOV BX,OFFSET BUF;输出字符

MOV CX,DI;循环计数初值

AA5: MOV DL,[BX]

MOV AH,2

INT 21H

INC BX

LOOP AA5

AA7: MOV AH,4CH

INT 21H

CODE ENDS

END START

8. 设从BUFFER开始存放若干个以$为结束标志的带符号字节数据,试编写将其中的正数按由大到小的顺序存入PLUS开始的缓冲区中的源程序。 答:

方法一

思路:将正数先存到目标地址,然后再排序。

DATA SEGMENT

BUFFER DB 1,2,3,4,5,6,7,-8,9,2,-1,-2,-3,-4,-5,-6,-7,-8,-9,1,'$'

PLUS DB (?)

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE,DS: DATA

START: MOV AX,DATA

MOV DS,AX

MOV DI,-1

LEA BX,BUFFER

LEA SI,PLUS

L1: MOV AL,[BX]

XOR AL,'$'

JNZ L2

JMP L4

L2: MOV AL,[BX]

ROL AL,1

JNC L3

INC BX

JMP L1

'$' '$'转移 ;初始化外循环计数器;判断当前字符是否为;不是;判断当前字符是否为正数;是正数转移L3: ROR AL,1 ;恢复数据

MOV [SI],AL ;将数据存入目标地址

INC DI

INC SI

INC BX

JMP L1

L4: CMP DI,0

JG L5

MOV AH,4CH

INT 21H

L5: LEA SI,PLUS

MOV CX,DI

L6: MOV AL,[SI]

CMP AL,[SI+1]

JNC L7

XCHG AL,[SI+1]

MOV [SI],AL

L7: INC SI

LOOP L6

DEC DI

JNZ L5

MOV AH,4CH

;正数个数>=2则开始排序 ;正数个数为0或1均跳出 ;以下为使用冒泡排序的方法对数据排序 INT 21H

CODE ENDS

END START

方法二

思路:在数据存放的原地址将数据进行由小到大的冒泡排序,则每次那循环可得到本次排序中的最大数,将其存入目的地址,直到得到一个非正的数后跳出。

DATA SEGMENT

BUFFER DB 1,2,3,4,5,6,7,-8,9,2,-1,-2,-3,-4,-5,-6,-7,-8,-9,1,'$'

PLUS DB (?)

DATA ENDS

CODE SEGMENT

ASSUME CS: CODE,DS: DATA

START: MOV AX,DATA

MOV DS,AX

MOV DI,-1 ;初始化外循环计数器

LEA SI,PLUS

LEA BX,BUFFER

L1: MOV AL,[BX]

XOR AL,'$' ;检查当前字符是否为'$'

JNZ L2

JMP L3

L2: INC DI

INC BX

JMP L1

L3: LEA BX,BUFFER ;开始排序

MOV CX,DI

L4: MOV AL,[BX]

CMP AL,[BX+1]

JLE L5

XCHG AL,[BX+1]

MOV [BX],AL

L5: INC BX

LOOP L4

MOV AL,[BX]

ROL AL,1

JNC AA4

MOV AH,4CH

INT 21H

L6: MOV DL,[BX]

MOV [SI],DL

INC SI

DEC DI

JNZ L3 ;前小后大转移 ;得到本次循环的最大数 ;检验是否为正数,是则转移;保存数据 ;进入下一次循环

MOV AH,4CH

INT 21H

CODE ENDS

END START

9. 试编写一源程序,要求将一个包含有20个数据的数组M分成两个数组:正数数组P和负数组N,并分别把这两个数组中数据的个数在CRT上显示出来。 答:

DATA SEGMENT

ORG 100H M DB 12,23,58,15,36,55,44,89,45,-23,-56,-47,-21,-65,32,69,82,58,29,-14 ;待处理数组

P DB 20 DUP(?) ;正数数组P

N DB 20 DUP(?) ;负数数组N

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

LEA SI,P ;P的首址送SI

LEA DI,N ;N的首址送DI

LEA BX,M ;M的首址送BX

XOR AX,AX ;AX清0

XOR DX,DX ;DX清0,DL/DH分别用于正/负数计数

MOV CX,20 ;分别处理M的20个数据

L1: MOV AL,[BX] ;取一个数组元素

TEST AL,80H ;AL,80H

JZ L2 ;

MOV [DI],AL ;AL

INC BX ;BX+1,

INC DI ;

INC DH ;

JMP L3 ;

L2: MOV [SI],AL ;AL

INC BX

INC SI ;

INC DL ;

L3: LOOP L1 ;

MOV CX,2 ;

L5: MOV BL,DL ;

SHR DL,1

SHR DL,1

SHR DL,1

SHR DL,1 ;按位与 结果为0,则AL为正,转L2 为负,送负数数组N 准备取M的下一个元素 负数数组N写位置后移一位 负数计数DH+1 本次处理结束 为正,送正数数组P 正数数组P写位置后移一位 正数计数DL+1 跳转进入下一次循环 二次输出循环,分别显示正负数的个数 保存DL,实质是暂时保存DL的低4位逻辑右移4位,即取高4位

CMP DL,10

JB L4 ;DL<10

ADD DL,7 ;DL>=10时,DL+7,9的ASCII码为39H,A的ASCII码为41H,相差8

L4: ADD DL,30H

MOV AH,2 ;

INT 21H

MOV DL,BL ;BL

AND DL,0FH ;DL

CMP DL,10

JB L6

ADD DL,7

L6: ADD DL,30H

MOV AH,2

INT 21H

MOV DL,0AH ;

MOV AH,2

INT 21H

MOV DL,0DH ;

MOV AH,2

INT 21H

MOV DL,DH ;DH

输出DL,正/负数个数的高位 送DL,准备显示正/负数个数的低位 高4位置0,因为DL的高4位已显示 换行 回车 送DL,准备显示负数的个数 LOOP L5

MOV AH,4CH ;返回DOS

INT 21H

CODE ENDS

END START

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

CODE SEGMENT

ASSUME CS:CODE

START: MOV AH,1 ;输入一个个位数N

INT 21H

CMP AL,30H

JC START ;小于0,要求重新输入

CMP AL,3AH

JNC START ;大于9,要求重新输入

AND AL,0FH

XOR CX,CX ;CX清0

MOV CL,AL ;循环响铃N次

MOV DL,07H ;响铃的ASCII码为07

AA1:MOV AH,2

INT 21H

LOOP AA1 ;循环响铃

MOV AH,4CH

INT 21H

CODE ENDS

END START

11.在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否有数字。如有,则把CL置0FFH,否则将CL置0。 答:

DATAS SEGMENT

STRING DB 'XYZIL12LWR';' '内可以是任意字符串

N EQU $-STRING;字符串长度

DATAS ENDS ;

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS

START:

MOV AX,DATAS

MOV DS,AX

MOV CX,N

LEA BX,STRING

AA1:MOV AL,[BX]

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

Top