汇编上机实验报告心得体会

汇编语言程序设计

第一次上机作业

1.从键盘上接受一个字符,找出他的前导字符和后继字符,按顺序显示这三个字符。 寄存器分配: AL:存输入值x DL:输出显示 流程图:如右图所示 DATA SEGMENT

A DB 0

DATA ENDS

STACK SEGMENT STACK

DB 200 DUP(0) STACK ENDS

CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE S: MOV AX,DATA

MOV DS,AX MOV AH,1

INT 21H INC AL MOV DL,AL MOV AH,2 INT 21H

DEC AL

MOV DL,AL MOV AH,2 INT 21H DEC AL MOV DL,AL MOV AH,2 INT 21H CODE ENDS END S

2.从键盘上输入一个数字字符,如不是,显示‘not odd’,否则显示‘odd’。 寄存器分配: AL:存输入值x DL:输出显示

流程图:如右图所示 程序代码如下:

DATA SEGMENT A DB 0

BUF DB,'NOT ODD$' EA DB,'ODD$' DATA ENDS

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS

CODE SEGMENT

ASSUME DS:DATA,SS:STACK,CS:CODE S: MOV AX,DATA MOV DS,AX MOV AH,1 INT 21H CMP AL,'0' JNGE B CMP AL,'9' JGE B LEA DX,EA MOV AH,9 INT 21H JMP C

B: LEA DX,BUF MOV AH,9 INT 21H

C: MOV AH,4CH INT 21H CODE ENDS END S

第二次上机作业

1.将以H为首地址的字节存储区中的技能被3整除又能被13整除的无符号整数的个数(假定

N =$-H DXB DW 3 BX:C DW 13 D DW 0 DATA ENDS

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX MOV CX,0 MOV BX,N LEA SI,H

LOPA: MOV AX,SI DIV B

MOV D,DX JNZ NEXT DIV C MOV D,DX JNZ NEXT MOV DL,[SI] MOV AH,2 INT 21H INC CX INC SI DEC DX JNZ LOPA NEXT: INC SI DEC DX JNZ LOPA EXIT: MOV DL,CL MOV AH,2 INT 21H

MOV AH,4CH INT 21H

CODE ENDS

END BEGIN

2.在以TAB为首地址的字存储区中存放有n个无符号数,统计低三位全为一的数的个数。 寄存器分配:SI:TAB的偏移地址 AX:存[SI] DX:计个数 CX:循环计数 STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS

DATA SEGMENT

TAB DW '1,9,10,20,30,40 ' N =($-TAB)/2 DATA ENDS

CODE SEGMENT

BEGIN: MOV AX,DATA MOV DS,AX MOV DX,0 MOV CX,N MOV BX,7H

LEA SI,TAB

LOPA: MOV AX,SI AND AX,BX CMP AX,BX JNE EXIT INC DX INC SI DEC CX JNZ LOPA NEXT: INC SI DEC CX JNZ LOPA

EXIT: MOV DL,DL MOV AH,2 INT 21H

MOV AH,4CH INT 21H CODE ENDS EMD BEGIN

3.键盘接受一串字符到BUF为首地址的字节单元中,要求用下列方法分别编程,将它们以相反的次序显示在屏幕的下一行中: (1).按地址从尾向前依次显示。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT BUF DB 20

DB ?

DB 20 DUP(0) BUF1 DB 20 DUP(0) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX LEA DX,BUF

MOV AH,10 INT 21H

MOV CL,BUF+1 MOV CH,0

LEA DI,BUF1 P1: LEA SI,BUF+2 ADD SI,CX DEC SI

MOV AL,[SI]

MOV BYTE PTR [DI],AL INC DI MOV DL,AL MOV AH,2 INT 21H LOOP P1 NEXT: MOV AH,4CH INT 21H CODE ENDS

END BEGIN

(2).利用堆栈反向显示。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT BUF DB 20 DB ?

DB 20 DUP(0) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,10 INT 21H MOV CL,BUF+1 MOV CH,0 LEA SI,BUF+2 P1: MOV AL,[SI] MOV AH,0 PUSH AX INC SI LOOP P1 P2: POP BX MOV DL,BL MOV AH,2 INT 21H

MOV CL,BUF+1 MOV CH,0 LOOP P2 NEXT: MOV AH,4CH INT 21H CODE ENDS

END BEGIN

(3).利用交换的方法反序后, 然后显示:即aiaj STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT BUF DB 'asfdcvb' N=$-BUF B DW ? A DB 2 DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX LEA SI,BUF LEA DI,BUF MOV CX,N DEC CX MOV B,CX INC CX

ADD DI,B MOV AX,CX DIV A

LOAP: MOV BL,[DI] MOV DL,[SI] XCHG BL,DL MOV [SI],DL MOV [DI],BL INC SI DEC DI DEC AL JNZ LOAP P2:LEA SI,BUF MOV DH,[SI] MOV DL,DH MOV AH,2 INT 21H INC SI LOOP P2 NEXT: MOV AH,4CH

INT 21H CODE ENDS

END BEGIN

第三次上机作业

1.在以BUF1和BUF2为首地址的两个字存储区中,分别存放有10个不相等的无符号数。依次找出同时在这两个存储区中出现的数,将他们放在以BUF3为首地址的存储区中。 寄存器分配:SI:BUF1偏移地址 DI:BUF2偏移地址 BP:BUF3偏移地址 CX,DX:循环计数 STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS

DATA SEGMENT

BUF1 DW 1,3,7,15,20,18,14,17,19,21 BUF2 DW 4,6,8,17,20,25,27,18,3,16 BUF3 DW 10 DUP(?) DATA ENDS

CODE SEGMENT

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

BEGIN: MOV AX,DATA MOV DS,AX LEA SI,BUFI

LEA DI,BUF2 LEA BP,BUF3 MOV CX,10 MOV DX,10 LOPA: MOV AX,[SI] MOV BX,[DI] CMP AX,BX

JE B

DEC DX JZ C

ADD DI,2 JMP LOPA

B: MOV (BP),AX ADD BP,2 DEC DX JZ C ADD DI JMP LOPA C: LEA DI,BUF2 INC SI MOV DX,10 DEC CX JZ D JMP LOPA

D: MOV AH,4CH INT 21H DATA ENDS END BEGIN

2.键盘接受一串字符到以TAB

寄存器分配:CX:计数控制循环 SI:TAB首地址 STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT TAB DB 100 DUP(0) DATA ENDS CODE SEGMENT

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

BEGIN: LEA SI,TAB MOV CX,10 LOPA1: MOV AH,1 INT 21H

MOV [SI],AL MOV DL,AL MOV AH,2 INT 21H DEC CX JNZ LOPA1 MOV DL,0AH MOV AH,2 INT 21H

MOV SI,0

MOV CX,10 LOPA2: MOV AL,[SI] CMP AL,’0’ JL A

CMP AL,’9’ JG A

MOV BL,SI LOPA3: INC SI

MOV [SI],[SI+1] DEC CX JNZ LOPA3 MOV SI,BL JMP LOPA2 A: MOV DL,AL MOV AH,2 INT 21H DEC CX JNZ LOPA2 MOV AH,4CH

INT 21H

CODE ENDS

END BEGIN

4.从键盘上接受若干个字符,

幕上。要求有提示信息。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS

DATA SEGMENT CE DB’CREATE ERROR!’WE DB’WRITE ERROR!’PI DB’PLEASE INPUT:’F_NAME DB’C:AB.ASM’,0 BUF DB 32767 DUP(?) F_NUM DW? DATA ENDS

CODE SEGMENT

ASSUME BEGIN: MOV AX,DATA

MOV DS,AX MOV AH,3CH MOV CX,0

LEA DX,F_NAME

INT 21H JNC C LEA DX,CE MOV AH,9 INT 21H

JMP EXIT

C: MOV F_NUME,AX LEA DX,PI MOV AH,9 INT 21H LEA DI,BUF INPUT: MOV AH,1 INT 21H

MOV [DI],AL INC DI MOV DL,[DI] MOV AH,2 INT 21H

CMP AL,0DH

JE ENDIN CMP AL,0DH JNE INPUT MOV DL,0AH MOV [DI],DL INC DI MOV AH,2 INT 21H JMP INPUT ENDINPUT: MOV AH,40H MOV BX,F_NUM LEA DX,BUF SUB DI,DX MOV CX,DI INT 21H JC E D: MOV AH,3EH INT 21H EXIT: MOV AH,4CH INT 21H E: LEA DX,WE MOV AH,9 INT 21H JMP D CODE ENDS

END BEGIN

4. 从键盘上接受若干个字符,以^Z结束,将其写到C:AB.ASM文件中保存,然后显示在

屏幕上。要求有提示信息。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT WDH DW ?

WM DB 'C:AB.ASM',0 BUFH DB 32676 DUP(?)

BUF1 DB 'CREAT ERROR!',0AH,0DH, '$' BUF2 DB 'WRITE ERROR!',0AH,0DH,'$' BUF3 DB 'NO SPACE!',0AH,0DH,'$'

BUF4 DB 'PLEASE INPUT:',0AH,0DH,'$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV ES,AX MOV AH,3CH MOV CX,0 LEA DX,WM INT 21H JNC P1

LEA DX,BUF1 MOV AH,9 INT 21H JMP NEXT P1:MOV WDH,AX LEA DX,BUF4 MOV AH,9 INT 21H LEA DI,BUFH P2:MOV AH,1

INT 21H

MOV BYTE PTR [DI],AL CMP AL,1AH JE P3 JMP P2

P3:MOV AH,40H MOV BX,WDH LEA DX,BUFH SUB DI,DX MOV CX,DI INT 21H JC P4

CMP AX,CX JE P5

LEA DX,BUF3 MOV AH,9 INT 21H

P5:MOV AH,3EH INT 21H MOV DL,[BX] MOV AH,2 INT 21H INC DX

LOOP P5

NEXT:MOV AH,4CH INT 21H

P4:LEA DX,BUF2 MOV AH,9 INT 21H JMP P5 CODE ENDS

END BEGIN

5从键盘上接受一存在的文本文件的名字,并将其内容分页显示出来。要求有信息提示。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT WDH DW ? WM DB 20

DB ?

DB 20 DUP (0) BUFH DB 32676 DUP(?)

BUF1 DB 'PLEASE INPUT:',0AH,0DH,'$' BUF2 DB 'READ ERROR!',0AH,0DH,'$' BUF3 DB 'OPEN ERROR!',0AH,0DH,'$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV ES,AX LEA DX,BUF1 MOV AH,9 INT 21H LEA DX,WM MOV AH,10 INT 21H MOV AH,2 MOV DL,0AH INT 21H

MOV DL,0DH INT 21H

MOV AL,WM+1

MOV AH,0 MOV BX,AX

MOV BYTE PTR [BX+WM+2],0 LEA DX,WM+2

MOV AX,3D00H INT 21H JC P1

MOV WDH,AX MOV BX,AX MOV CX,32767 LEA DX,BUFH MOV AH,3FH INT 21H JC P2

MOV AX,CX MOV BX,WDH MOV AH,3EH INT 21H MOV AH,2 MOV DL,0AH

INT 21H

MOV DL,0DH INT 21H

LEA BX,BUFH

LOPA: MOV DL,[BX] MOV AH,2 INT 21H INC BX

LOOP LOPA EXIT: MOV AH,4CH INT 21H P1: LEA DX,BUF2 MOV AH,9 INT 21H JMPE EXIT P2: LEA DX,BUF3 MOV AH,9 INT 21H JMP EXIT CODE ENDS END BEGIN

第四次上机作业

1在STR串中寻找&,若找到删除,并分两行显示删除前后的字符串;若找不到,则显示“find fall”.

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT

BUF DB 3,2,5,4,&M,9,&,A,A COUNT EQU $-STR DATA ENDS

CODE SEGMENT ASSUME DS:DATA;SS:STACK;CS:CODE; STAR: MOV AX,DATA MOV DS,AX LEA DI,BUF

LEA SI,BUF P: MOV AL,’&’ REPNE SCASB JNE EXIT MOV SI,DI A: MOV BX,[DI+1] MOV [DI],BX INC DI

CMP DI,COUNT JNE A SUB COUNT MOV CX,COUNT JZ EXIT MOV DI,SI SUB CX,SI JNZ P

MOV CX,COUNT LEA SI,BUF B: LOBSB MOV DL,AL MOV AH,2 INT 21H DEC CX JNZ B EXIT: MOV AH,4CH INT 21H CODE ENDS

END STAR

(2).将显示字符串和回车换行的指令段分别编一宏定义,然后调用;

WRITE MACRO A LEA DX,A MOV AH,9 INT 21H ENDM CRLF MACRO A MOV AH,2 MOV DL,0AH INT 21H

MOV DL,0DH INT 21H ENDM

STACK SEGMENT STACK DB 200 DUP (0) STACK ENDS DATA SEGMENT STR DB 'ABC&D $' N =$-STR

BUF DB 'FIND ERROR! $' DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,STR LEA DI,STR MOV CX,N WRITE STR CRLF CLD P1: LODSB CMP AL,'&' JE P2 STOSB P2: LOOP P1 CMP SI,DI JNE P3

WRITE BUF JMP NEST

P3: WRITE STR NEST: MOV AX,4C00H INT 21H CODE ENDS

END BEGIN

(3).将显示字符串和回车换行的指令段编成宏定义,存入宏库中,然后调用。 INCLUDE C:\Users\小鹰\Desktop\123.txt

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT STR DB 'ABC&D $' N =$-STR

BUF DB 'FIND ERROR! $' DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,STR LEA DI,STR MOV CX,N WRITE STR CRLF CLD P1: LODSB CMP AL,'&' JE P2 STOSB P2: LOOP P1 CMP SI,DI JNE P3 WRITE BUF JMP NEST P3: WRITE STR NEST: MOV AX,4C00H INT 21H CODE ENDS

END BEGIN

2.

STACK SEGMENT STACK DB 200 DUP (0) STACK ENDS DATA SEGMENT A DB 10 DUP(?) B DB 10 DUP(?)

BUF DB ‘PLEASE INPUT:$’ DATA ENDS CODE SEGMENT

ASSUME DS:DASTA: MOV AX,DATA MOV DS,AX LEA DL,BUF MOV AH,9 INT 21H LEA DX,A MOV AH,10 INT 21H MOV DL,0DH MOV AH,2 INT 21H LEA SI,A LEA DI,B A: MOV AL,[SI] CMP AL,41H JL C

CMP AL,5AH JEC B

CMP AL,61H

JL C

CMP AL,71H JG C

B:MOV [DI],AL INC DI C: INC SI DEC CX JNZ A MOV [DI],$ LEA AX,B MOV AH,10 INT 21H MOV AH,4CH INT 21H

CODE ENDS END STA

3.利用串编程:在一字符串中搜索一字符$,如果找到,显示其在串中的位置,否则,显示‘not’。 STACK SEGMENT STACK DB 200 DUP (0) STACK ENDS

DATA SEGMENT

STR DB ‘A1234568$584R’ COUNT EQU $-STR

BUF 0AH,0DH,’NOT’ DATA ENDS

CODE SEGMENT

ASSUME DS:DATA;CS:CODE:SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,STR MOV CX,COUNT MOV AL,$

P: REPNE SCASB JE A

JMP B A: INC DI MOV AL,DI MOV DL,AL MOV AH,2 INT 21H JMP XIT B: LEA DX,BUF MOV AH,9 INT 21H

EXIT: MOV AH,4CH INT 21H CODE ENDS

END START

4. 利用模块结构编程:从键盘上输入一个二位十进制的月份(01~12),然后显示相应月份的英文缩写名。

主模块:键盘接受一个二位十进制数,并换成二进制数; 子模块:有两个子程序构成:

(1) 依输入月份数查英文缩写月份名表;

EXTRN SEARCH:FAR,VIEW:FAR PUBLIC BUF,BUF1 DATA SEGMENT 'D' BUF DB ?,?,? BUF1 DB 'JAN$' DB 'FEB$' DB 'MAR$' DB 'APR$' DB 'MAY$' DB 'JUN$' DB 'JUL$' DB 'AUG$' DB 'SEP$' DB 'OCT$'

DB 'NOV$' DB 'DEC$' DATA ENDS

STACK SEGMENT STACK 'S' DB 200 DUP(?) STACK ENDS

CODE SEGMENT 'C'

ASSUME CS:CODE,SS:STACK,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CL,1 MOV CH,12 INPUT: MOV AH,1 INT 21H

MOV BUF,AL MOV AH,1 INT 21H

MOV BUF+1,AL MOV AH,1 INT 21H TRANS: SUB BUF,30H SUB BUF+1,30H MOV AL,10

MUL BUF

MOV BUF,AL MOV AL,BUF+1 ADD BUF,AL CALL SEARCH

CALL VIEW EXIT: MOV AH,4CH INT 21H CODE ENDS

END START

(2) 显示查到的月份的英文缩写名。

EXTRN BUF:BYTE,BUF1:BYTE PUBLIC SEARCH,VIEW

STACK SEGMENT STACK 'S1' DB 200 DUP(?) STACK ENDS

CODE SEGMENT 'C1'

ASSUME CS:CODE,SS:STACK SEARCH PROC FAR L1: CMP BUF,CL JZ P_PNT INC CL JMP L1 P_PNT: DEC CL MOV AL,4 MUL CL MOV BX,AX RET ENDP

VIEW PROC FAR MOV AH,2 MOV DL,0AH INT 21H

LEA DX,BUF1[BX] MOV AH,9 INT 21H RET ENDP CODE ENDS END

第五次上机作业

1. 利用软中断调用方式编程:在以BUF为首地址的字节存储区中,存有n个二位十进制的

无符号整数,要求以相反的次序将这些数显示出来(要求:拼数和显示编写中断处理程

序)。 寄存器分配:

BX:作为BUF为首地址的存储区的地址指针。 SI:作为BUF为首地址的存储区的地址指针。 AL,DL,AH:暂存数据。 CX:循环计数器。

主模块:

EXTRN INTR45:FAR PUBLIC B

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT BUF DB 15,18,22,24,5 n=$-BUF B DB ? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,SEG INTR45 MOV DS,AX

MOV DX,OFFSET INTR45 MOV AX,2545H INT 21H MOV AX,DATA MOV DS,AX MOV BX,0 LEA SI,BUF MOV BX,n-1 MOV CX,n

L1: MOV DH,[SI+BX] INT 45H MOV AH,2 MOV DL,' ' INT 21H DEC BX LOOP L1

EXIT: MOV AH,4CH INT 21H CODE ENDS END START

子模块: PUBLIC INTR45 EXTRN B:BYTE

STACK SEGMENT STACK DB 100 DUP(?)

STACK ENDS CODE SEGMENT

ASSUME CS:CODE,SS:STACK INTR45 PROC FAR MOV AL,DH MOV AH,0 MOV B,10 DIV B

ADD AL,30H ADD AH,30H MOV B,AH MOV AH,2 MOV DL,AL INT 21H MOV AH,2 MOV DL,B INT 21H IRET ENDP

EXIT: MOV AH,4CH

INT 21H CODE ENDS

END 输出:05 24 22 18 15

2.

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT F_NAME DB’C:ABC.TXT’,0 F_NUM DW?

BUFIN 32767 DUP(0) DATA ENDS

CODE SEGMENT

ASSUME DS:DA BEGIN: MOV AX,DATA

MOV DS,AX MOV AX,3CH MOV CX,0

LEA DX,F_NAME INT 21H JNC A LEA DI,BUFIN LEA DX,CE MOV AH,9 INT 21H

JMP EXIT A:MOV AH,6 MOV AL,1

MOV CX,0

MOV DX,0901H INT 10

MOV DX,0901H MOV AH,2 INT 10

INPUT: MOV CX,10 MOV AH,0AH MOV AH,1 INT 21H MOV [DI],AL INC DI DEC CX JZ ENDIN JMP INPUT ENDIN: MOV AH,40H MOV BX,F_NUM LEA DX,BUFIN SUB DI,DX

MOV CX,DI INT 21H

B: MOV AH,3EH

INT 21H

EXIT : MOV AH,4CH

INT 21H CODE ENDS END BEGIN

姓名:王飓烜

学号:[1**********]0 班级:08软件工程3班

汇编语言程序设计 姓名: 学号: 班级:xxx

软件工程3班080107031xxx 08

汇编语言程序设计

第一次上机作业

1.从键盘上接受一个字符,找出他的前导字符和后继字符,按顺序显示这三个字符。 寄存器分配: AL:存输入值x DL:输出显示 流程图:如右图所示 DATA SEGMENT

A DB 0

DATA ENDS

STACK SEGMENT STACK

DB 200 DUP(0) STACK ENDS

CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE S: MOV AX,DATA

MOV DS,AX MOV AH,1

INT 21H INC AL MOV DL,AL MOV AH,2 INT 21H

DEC AL

MOV DL,AL MOV AH,2 INT 21H DEC AL MOV DL,AL MOV AH,2 INT 21H CODE ENDS END S

2.从键盘上输入一个数字字符,如不是,显示‘not odd’,否则显示‘odd’。 寄存器分配: AL:存输入值x DL:输出显示

流程图:如右图所示 程序代码如下:

DATA SEGMENT A DB 0

BUF DB,'NOT ODD$' EA DB,'ODD$' DATA ENDS

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS

CODE SEGMENT

ASSUME DS:DATA,SS:STACK,CS:CODE S: MOV AX,DATA MOV DS,AX MOV AH,1 INT 21H CMP AL,'0' JNGE B CMP AL,'9' JGE B LEA DX,EA MOV AH,9 INT 21H JMP C

B: LEA DX,BUF MOV AH,9 INT 21H

C: MOV AH,4CH INT 21H CODE ENDS END S

第二次上机作业

1.将以H为首地址的字节存储区中的技能被3整除又能被13整除的无符号整数的个数(假定

N =$-H DXB DW 3 BX:C DW 13 D DW 0 DATA ENDS

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT

ASSUME CS:CODE,SS:STACK,DS:DATA BEGIN: MOV AX,DATA MOV DS,AX MOV CX,0 MOV BX,N LEA SI,H

LOPA: MOV AX,SI DIV B

MOV D,DX JNZ NEXT DIV C MOV D,DX JNZ NEXT MOV DL,[SI] MOV AH,2 INT 21H INC CX INC SI DEC DX JNZ LOPA NEXT: INC SI DEC DX JNZ LOPA EXIT: MOV DL,CL MOV AH,2 INT 21H

MOV AH,4CH INT 21H

CODE ENDS

END BEGIN

2.在以TAB为首地址的字存储区中存放有n个无符号数,统计低三位全为一的数的个数。 寄存器分配:SI:TAB的偏移地址 AX:存[SI] DX:计个数 CX:循环计数 STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS

DATA SEGMENT

TAB DW '1,9,10,20,30,40 ' N =($-TAB)/2 DATA ENDS

CODE SEGMENT

BEGIN: MOV AX,DATA MOV DS,AX MOV DX,0 MOV CX,N MOV BX,7H

LEA SI,TAB

LOPA: MOV AX,SI AND AX,BX CMP AX,BX JNE EXIT INC DX INC SI DEC CX JNZ LOPA NEXT: INC SI DEC CX JNZ LOPA

EXIT: MOV DL,DL MOV AH,2 INT 21H

MOV AH,4CH INT 21H CODE ENDS EMD BEGIN

3.键盘接受一串字符到BUF为首地址的字节单元中,要求用下列方法分别编程,将它们以相反的次序显示在屏幕的下一行中: (1).按地址从尾向前依次显示。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT BUF DB 20

DB ?

DB 20 DUP(0) BUF1 DB 20 DUP(0) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX LEA DX,BUF

MOV AH,10 INT 21H

MOV CL,BUF+1 MOV CH,0

LEA DI,BUF1 P1: LEA SI,BUF+2 ADD SI,CX DEC SI

MOV AL,[SI]

MOV BYTE PTR [DI],AL INC DI MOV DL,AL MOV AH,2 INT 21H LOOP P1 NEXT: MOV AH,4CH INT 21H CODE ENDS

END BEGIN

(2).利用堆栈反向显示。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT BUF DB 20 DB ?

DB 20 DUP(0) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,10 INT 21H MOV CL,BUF+1 MOV CH,0 LEA SI,BUF+2 P1: MOV AL,[SI] MOV AH,0 PUSH AX INC SI LOOP P1 P2: POP BX MOV DL,BL MOV AH,2 INT 21H

MOV CL,BUF+1 MOV CH,0 LOOP P2 NEXT: MOV AH,4CH INT 21H CODE ENDS

END BEGIN

(3).利用交换的方法反序后, 然后显示:即aiaj STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT BUF DB 'asfdcvb' N=$-BUF B DW ? A DB 2 DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX LEA SI,BUF LEA DI,BUF MOV CX,N DEC CX MOV B,CX INC CX

ADD DI,B MOV AX,CX DIV A

LOAP: MOV BL,[DI] MOV DL,[SI] XCHG BL,DL MOV [SI],DL MOV [DI],BL INC SI DEC DI DEC AL JNZ LOAP P2:LEA SI,BUF MOV DH,[SI] MOV DL,DH MOV AH,2 INT 21H INC SI LOOP P2 NEXT: MOV AH,4CH

INT 21H CODE ENDS

END BEGIN

第三次上机作业

1.在以BUF1和BUF2为首地址的两个字存储区中,分别存放有10个不相等的无符号数。依次找出同时在这两个存储区中出现的数,将他们放在以BUF3为首地址的存储区中。 寄存器分配:SI:BUF1偏移地址 DI:BUF2偏移地址 BP:BUF3偏移地址 CX,DX:循环计数 STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS

DATA SEGMENT

BUF1 DW 1,3,7,15,20,18,14,17,19,21 BUF2 DW 4,6,8,17,20,25,27,18,3,16 BUF3 DW 10 DUP(?) DATA ENDS

CODE SEGMENT

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

BEGIN: MOV AX,DATA MOV DS,AX LEA SI,BUFI

LEA DI,BUF2 LEA BP,BUF3 MOV CX,10 MOV DX,10 LOPA: MOV AX,[SI] MOV BX,[DI] CMP AX,BX

JE B

DEC DX JZ C

ADD DI,2 JMP LOPA

B: MOV (BP),AX ADD BP,2 DEC DX JZ C ADD DI JMP LOPA C: LEA DI,BUF2 INC SI MOV DX,10 DEC CX JZ D JMP LOPA

D: MOV AH,4CH INT 21H DATA ENDS END BEGIN

2.键盘接受一串字符到以TAB

寄存器分配:CX:计数控制循环 SI:TAB首地址 STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT TAB DB 100 DUP(0) DATA ENDS CODE SEGMENT

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

BEGIN: LEA SI,TAB MOV CX,10 LOPA1: MOV AH,1 INT 21H

MOV [SI],AL MOV DL,AL MOV AH,2 INT 21H DEC CX JNZ LOPA1 MOV DL,0AH MOV AH,2 INT 21H

MOV SI,0

MOV CX,10 LOPA2: MOV AL,[SI] CMP AL,’0’ JL A

CMP AL,’9’ JG A

MOV BL,SI LOPA3: INC SI

MOV [SI],[SI+1] DEC CX JNZ LOPA3 MOV SI,BL JMP LOPA2 A: MOV DL,AL MOV AH,2 INT 21H DEC CX JNZ LOPA2 MOV AH,4CH

INT 21H

CODE ENDS

END BEGIN

4.从键盘上接受若干个字符,

幕上。要求有提示信息。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS

DATA SEGMENT CE DB’CREATE ERROR!’WE DB’WRITE ERROR!’PI DB’PLEASE INPUT:’F_NAME DB’C:AB.ASM’,0 BUF DB 32767 DUP(?) F_NUM DW? DATA ENDS

CODE SEGMENT

ASSUME BEGIN: MOV AX,DATA

MOV DS,AX MOV AH,3CH MOV CX,0

LEA DX,F_NAME

INT 21H JNC C LEA DX,CE MOV AH,9 INT 21H

JMP EXIT

C: MOV F_NUME,AX LEA DX,PI MOV AH,9 INT 21H LEA DI,BUF INPUT: MOV AH,1 INT 21H

MOV [DI],AL INC DI MOV DL,[DI] MOV AH,2 INT 21H

CMP AL,0DH

JE ENDIN CMP AL,0DH JNE INPUT MOV DL,0AH MOV [DI],DL INC DI MOV AH,2 INT 21H JMP INPUT ENDINPUT: MOV AH,40H MOV BX,F_NUM LEA DX,BUF SUB DI,DX MOV CX,DI INT 21H JC E D: MOV AH,3EH INT 21H EXIT: MOV AH,4CH INT 21H E: LEA DX,WE MOV AH,9 INT 21H JMP D CODE ENDS

END BEGIN

4. 从键盘上接受若干个字符,以^Z结束,将其写到C:AB.ASM文件中保存,然后显示在

屏幕上。要求有提示信息。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT WDH DW ?

WM DB 'C:AB.ASM',0 BUFH DB 32676 DUP(?)

BUF1 DB 'CREAT ERROR!',0AH,0DH, '$' BUF2 DB 'WRITE ERROR!',0AH,0DH,'$' BUF3 DB 'NO SPACE!',0AH,0DH,'$'

BUF4 DB 'PLEASE INPUT:',0AH,0DH,'$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV ES,AX MOV AH,3CH MOV CX,0 LEA DX,WM INT 21H JNC P1

LEA DX,BUF1 MOV AH,9 INT 21H JMP NEXT P1:MOV WDH,AX LEA DX,BUF4 MOV AH,9 INT 21H LEA DI,BUFH P2:MOV AH,1

INT 21H

MOV BYTE PTR [DI],AL CMP AL,1AH JE P3 JMP P2

P3:MOV AH,40H MOV BX,WDH LEA DX,BUFH SUB DI,DX MOV CX,DI INT 21H JC P4

CMP AX,CX JE P5

LEA DX,BUF3 MOV AH,9 INT 21H

P5:MOV AH,3EH INT 21H MOV DL,[BX] MOV AH,2 INT 21H INC DX

LOOP P5

NEXT:MOV AH,4CH INT 21H

P4:LEA DX,BUF2 MOV AH,9 INT 21H JMP P5 CODE ENDS

END BEGIN

5从键盘上接受一存在的文本文件的名字,并将其内容分页显示出来。要求有信息提示。

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT WDH DW ? WM DB 20

DB ?

DB 20 DUP (0) BUFH DB 32676 DUP(?)

BUF1 DB 'PLEASE INPUT:',0AH,0DH,'$' BUF2 DB 'READ ERROR!',0AH,0DH,'$' BUF3 DB 'OPEN ERROR!',0AH,0DH,'$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV ES,AX LEA DX,BUF1 MOV AH,9 INT 21H LEA DX,WM MOV AH,10 INT 21H MOV AH,2 MOV DL,0AH INT 21H

MOV DL,0DH INT 21H

MOV AL,WM+1

MOV AH,0 MOV BX,AX

MOV BYTE PTR [BX+WM+2],0 LEA DX,WM+2

MOV AX,3D00H INT 21H JC P1

MOV WDH,AX MOV BX,AX MOV CX,32767 LEA DX,BUFH MOV AH,3FH INT 21H JC P2

MOV AX,CX MOV BX,WDH MOV AH,3EH INT 21H MOV AH,2 MOV DL,0AH

INT 21H

MOV DL,0DH INT 21H

LEA BX,BUFH

LOPA: MOV DL,[BX] MOV AH,2 INT 21H INC BX

LOOP LOPA EXIT: MOV AH,4CH INT 21H P1: LEA DX,BUF2 MOV AH,9 INT 21H JMPE EXIT P2: LEA DX,BUF3 MOV AH,9 INT 21H JMP EXIT CODE ENDS END BEGIN

第四次上机作业

1在STR串中寻找&,若找到删除,并分两行显示删除前后的字符串;若找不到,则显示“find fall”.

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT

BUF DB 3,2,5,4,&M,9,&,A,A COUNT EQU $-STR DATA ENDS

CODE SEGMENT ASSUME DS:DATA;SS:STACK;CS:CODE; STAR: MOV AX,DATA MOV DS,AX LEA DI,BUF

LEA SI,BUF P: MOV AL,’&’ REPNE SCASB JNE EXIT MOV SI,DI A: MOV BX,[DI+1] MOV [DI],BX INC DI

CMP DI,COUNT JNE A SUB COUNT MOV CX,COUNT JZ EXIT MOV DI,SI SUB CX,SI JNZ P

MOV CX,COUNT LEA SI,BUF B: LOBSB MOV DL,AL MOV AH,2 INT 21H DEC CX JNZ B EXIT: MOV AH,4CH INT 21H CODE ENDS

END STAR

(2).将显示字符串和回车换行的指令段分别编一宏定义,然后调用;

WRITE MACRO A LEA DX,A MOV AH,9 INT 21H ENDM CRLF MACRO A MOV AH,2 MOV DL,0AH INT 21H

MOV DL,0DH INT 21H ENDM

STACK SEGMENT STACK DB 200 DUP (0) STACK ENDS DATA SEGMENT STR DB 'ABC&D $' N =$-STR

BUF DB 'FIND ERROR! $' DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,STR LEA DI,STR MOV CX,N WRITE STR CRLF CLD P1: LODSB CMP AL,'&' JE P2 STOSB P2: LOOP P1 CMP SI,DI JNE P3

WRITE BUF JMP NEST

P3: WRITE STR NEST: MOV AX,4C00H INT 21H CODE ENDS

END BEGIN

(3).将显示字符串和回车换行的指令段编成宏定义,存入宏库中,然后调用。 INCLUDE C:\Users\小鹰\Desktop\123.txt

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT STR DB 'ABC&D $' N =$-STR

BUF DB 'FIND ERROR! $' DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,STR LEA DI,STR MOV CX,N WRITE STR CRLF CLD P1: LODSB CMP AL,'&' JE P2 STOSB P2: LOOP P1 CMP SI,DI JNE P3 WRITE BUF JMP NEST P3: WRITE STR NEST: MOV AX,4C00H INT 21H CODE ENDS

END BEGIN

2.

STACK SEGMENT STACK DB 200 DUP (0) STACK ENDS DATA SEGMENT A DB 10 DUP(?) B DB 10 DUP(?)

BUF DB ‘PLEASE INPUT:$’ DATA ENDS CODE SEGMENT

ASSUME DS:DASTA: MOV AX,DATA MOV DS,AX LEA DL,BUF MOV AH,9 INT 21H LEA DX,A MOV AH,10 INT 21H MOV DL,0DH MOV AH,2 INT 21H LEA SI,A LEA DI,B A: MOV AL,[SI] CMP AL,41H JL C

CMP AL,5AH JEC B

CMP AL,61H

JL C

CMP AL,71H JG C

B:MOV [DI],AL INC DI C: INC SI DEC CX JNZ A MOV [DI],$ LEA AX,B MOV AH,10 INT 21H MOV AH,4CH INT 21H

CODE ENDS END STA

3.利用串编程:在一字符串中搜索一字符$,如果找到,显示其在串中的位置,否则,显示‘not’。 STACK SEGMENT STACK DB 200 DUP (0) STACK ENDS

DATA SEGMENT

STR DB ‘A1234568$584R’ COUNT EQU $-STR

BUF 0AH,0DH,’NOT’ DATA ENDS

CODE SEGMENT

ASSUME DS:DATA;CS:CODE:SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,STR MOV CX,COUNT MOV AL,$

P: REPNE SCASB JE A

JMP B A: INC DI MOV AL,DI MOV DL,AL MOV AH,2 INT 21H JMP XIT B: LEA DX,BUF MOV AH,9 INT 21H

EXIT: MOV AH,4CH INT 21H CODE ENDS

END START

4. 利用模块结构编程:从键盘上输入一个二位十进制的月份(01~12),然后显示相应月份的英文缩写名。

主模块:键盘接受一个二位十进制数,并换成二进制数; 子模块:有两个子程序构成:

(1) 依输入月份数查英文缩写月份名表;

EXTRN SEARCH:FAR,VIEW:FAR PUBLIC BUF,BUF1 DATA SEGMENT 'D' BUF DB ?,?,? BUF1 DB 'JAN$' DB 'FEB$' DB 'MAR$' DB 'APR$' DB 'MAY$' DB 'JUN$' DB 'JUL$' DB 'AUG$' DB 'SEP$' DB 'OCT$'

DB 'NOV$' DB 'DEC$' DATA ENDS

STACK SEGMENT STACK 'S' DB 200 DUP(?) STACK ENDS

CODE SEGMENT 'C'

ASSUME CS:CODE,SS:STACK,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CL,1 MOV CH,12 INPUT: MOV AH,1 INT 21H

MOV BUF,AL MOV AH,1 INT 21H

MOV BUF+1,AL MOV AH,1 INT 21H TRANS: SUB BUF,30H SUB BUF+1,30H MOV AL,10

MUL BUF

MOV BUF,AL MOV AL,BUF+1 ADD BUF,AL CALL SEARCH

CALL VIEW EXIT: MOV AH,4CH INT 21H CODE ENDS

END START

(2) 显示查到的月份的英文缩写名。

EXTRN BUF:BYTE,BUF1:BYTE PUBLIC SEARCH,VIEW

STACK SEGMENT STACK 'S1' DB 200 DUP(?) STACK ENDS

CODE SEGMENT 'C1'

ASSUME CS:CODE,SS:STACK SEARCH PROC FAR L1: CMP BUF,CL JZ P_PNT INC CL JMP L1 P_PNT: DEC CL MOV AL,4 MUL CL MOV BX,AX RET ENDP

VIEW PROC FAR MOV AH,2 MOV DL,0AH INT 21H

LEA DX,BUF1[BX] MOV AH,9 INT 21H RET ENDP CODE ENDS END

第五次上机作业

1. 利用软中断调用方式编程:在以BUF为首地址的字节存储区中,存有n个二位十进制的

无符号整数,要求以相反的次序将这些数显示出来(要求:拼数和显示编写中断处理程

序)。 寄存器分配:

BX:作为BUF为首地址的存储区的地址指针。 SI:作为BUF为首地址的存储区的地址指针。 AL,DL,AH:暂存数据。 CX:循环计数器。

主模块:

EXTRN INTR45:FAR PUBLIC B

STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT BUF DB 15,18,22,24,5 n=$-BUF B DB ? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,SEG INTR45 MOV DS,AX

MOV DX,OFFSET INTR45 MOV AX,2545H INT 21H MOV AX,DATA MOV DS,AX MOV BX,0 LEA SI,BUF MOV BX,n-1 MOV CX,n

L1: MOV DH,[SI+BX] INT 45H MOV AH,2 MOV DL,' ' INT 21H DEC BX LOOP L1

EXIT: MOV AH,4CH INT 21H CODE ENDS END START

子模块: PUBLIC INTR45 EXTRN B:BYTE

STACK SEGMENT STACK DB 100 DUP(?)

STACK ENDS CODE SEGMENT

ASSUME CS:CODE,SS:STACK INTR45 PROC FAR MOV AL,DH MOV AH,0 MOV B,10 DIV B

ADD AL,30H ADD AH,30H MOV B,AH MOV AH,2 MOV DL,AL INT 21H MOV AH,2 MOV DL,B INT 21H IRET ENDP

EXIT: MOV AH,4CH

INT 21H CODE ENDS

END 输出:05 24 22 18 15

2.

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT F_NAME DB’C:ABC.TXT’,0 F_NUM DW?

BUFIN 32767 DUP(0) DATA ENDS

CODE SEGMENT

ASSUME DS:DA BEGIN: MOV AX,DATA

MOV DS,AX MOV AX,3CH MOV CX,0

LEA DX,F_NAME INT 21H JNC A LEA DI,BUFIN LEA DX,CE MOV AH,9 INT 21H

JMP EXIT A:MOV AH,6 MOV AL,1

MOV CX,0

MOV DX,0901H INT 10

MOV DX,0901H MOV AH,2 INT 10

INPUT: MOV CX,10 MOV AH,0AH MOV AH,1 INT 21H MOV [DI],AL INC DI DEC CX JZ ENDIN JMP INPUT ENDIN: MOV AH,40H MOV BX,F_NUM LEA DX,BUFIN SUB DI,DX

MOV CX,DI INT 21H

B: MOV AH,3EH

INT 21H

EXIT : MOV AH,4CH

INT 21H CODE ENDS END BEGIN

姓名:王飓烜

学号:[1**********]0 班级:08软件工程3班

汇编语言程序设计 姓名: 学号: 班级:xxx

软件工程3班080107031xxx 08


相关文章

  • 微机原理及应用上机实验报告2数据传送
  • 实验报告 课程名称:_________微机原理及应用___________指导老师:_____钟崴_______成绩:__________________ 实验名称:_________数据传送___________实验类型:________ ...查看


  • 南昌大学实验报告格式
  • 南昌大学实验报告 学生姓名: 学 号: 专业班级: 实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩: 实验一 汇编语言程序上机实验 一.实验目的 熟练掌握汇编语言程序的编辑.调试和运行的过程和方法.了解汇编语程序的汇 ...查看


  • 微机原理实验报告(2013)
  • 计算机在金属材料 中的应用实验 山东科技大学材料学院 目 录 一.调试程序DEBUG 二.熟悉80486指令系统 三.熟悉汇编语言汇编程序上机过程 四.汇编程序分支程序设计一 五.汇编程序分支程序设计二 六.汇编程序循环程序设计一 七.汇编 ...查看


  • 32位微机原理上机实验报告:显示程序实验
  • 西北工业大学明德学院 实验报告 实验项目 微机原理及应用 班 级 121204 姓 名 田家豪 王辰硕 学 号 121566 121567 指导老师 伍明高 时 间 2015-3-17 实验题目 显示程序实验 实验目的 (1) 掌握在PC机 ...查看


  • 工业用微型计算机实验及答案
  • 一.实验目的:1.联系掌握DEBUG 调试程序的使用 2.加深对汇编语言指令.机器码.寻址方式等基本内容的理解 二.实验设备:计算机 三.实验内容:1.DEBUG 调试程序的启动 2.练习D .E .F .R .A .U .T .G .N ...查看


  • 汇编语言指导私人注释版
  • 目 录 实验一 DEBUG 常用命令及8086指令使用 ..................... - 1 - 实验二 内存操作数及寻址方法 .......................................... - 5 - ...查看


  • 计算机操作系统上机实验报告
  • 课程设计(上机实验) 报告 课程名称: 学生姓名: 学 号: 所在学院: 专 业: 指导教师: 年 月 日 课程设计(上机实验)报告填写说明 1.本报告作为指导教师对学生课程设计(上机实验)评分的依据材料之一.此报告应在指导教师指导下,由学 ...查看


  • 汇编语言课程设计报告a
  • 课 程 设 计 报 告 课程名称 80x86 汇编语言程序设计 课题名称 班级成绩管理程序 专 业 应用技术学院 班 级 学 号姓 名 戴 天 翔 指导教师 刘 铁 武 2007年 9 月 28 日 湖南工程学院 课 程 设 计 任 务 书 ...查看


  • 单片机原理及应用课程设计
  • 单片机课程设计 课题目 学 院 专业名称 班 级 学 号 姓 名 指导教师 串行通讯系统设计 工学院 机械设计制造及其自动化 机械11-4班 111014410 高尚 张超一 目 录 一.课程设计的任务和目的 ............... ...查看


热门内容