汇编第一次、第二次上机作业答案

发布于:2021-09-28 12:14:44

第一次上机作业 1.将以 1.将以 H 为首地址的字节存储区中的既能被 3 整除也能被 13 整除的无符号整数 的个数(假定≤ 显示出来,同时对应的显示它们分别对应的地址偏移量。 (利 的个数(假定≤9)显示出来,同时对应的显示它们分别对应的地址偏移量。 利 ( 用多种寻址方式做) 用多种寻址方式做) 解: (1)变址寻址: (1)变址寻址: 变址寻址 寄存器分配: 寄存器分配: BX: 为首地址的存储区的地址指针。 BX:作为 H 为首地址的存储区的地址指针。 SI: 为首地址的存储区的地址指针。 SI:作为 A 为首地址的存储区的地址指针。 同上。 DI: 同上。 AX:暂存数据。 AX:暂存数据。 代码: 代码: STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT H DB 3,5,7,78,13,39 N=$N=$-H A DB N DUP(?) C DB ? D DB ?,0 E DB ? F DB 'THE NUMBER IS:$' G DB 0AH,0DH,'$' I DB 'ADDRESS OFFSET:$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START : MOV AX,DATA MOV DS,AX MOV BX,0 MOV SI,0 MOV DI,0 MOV E,0 L1: CMP BX,N JAE PRINT MOV AL,H[BX] MOV D,AL MOV AX,WORD PTR D MOV C,3 DIV C

CMP AH,0 JNE L2 MOV AX,WORD PTR D MOV C,13 DIV C CMP AH,0 JNE L2 INC E MOV A[SI],BL ADD A[SI],30H INC SI INC BX JMP L1 L2: INC BX JMP L1 PRINT: LEA DX,F MOV AH,9 INT 21H LEA DX,G MOV AH,9 INT 21H ADD E,30H MOV DL,E MOV AH,2 INT 21H LEA DX,G MOV AH,9 INT 21H L3: CMP DI,SI JAE EXIT LEA DX,I MOV AH,9 INT 21H MOV DL,A[DI] MOV AH,2 INT 21H MOV DL,' ' MOV AH,2 INT 21H INC DI JMP L3 EXIT: MOV AH,4CH INT 21H

CODE ENDS END START

输出: IS: 输出:THE NUMBER IS: 2 ADDRESS OFFSET:3 ADDRESS OFFSET:5 (2)寄存器间接寻址: (2)寄存器间接寻址: 寄存器间接寻址 寄存器分配: 寄存器分配: BX: 为首地址的存储区的地址指针。 BX:作为 H 为首地址的存储区的地址指针。 SI: 为首地址的存储区的地址指针。 SI:作为 A 为首地址的存储区的地址指针。 同上。 DI: 同上。 AX:暂存数据。 AX:暂存数据。 CX:循环计数器和偏移量计数器。 CX:循环计数器和偏移量计数器。 代码: 代码: STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT H DB 3,5,7,78,13,39 N=$N=$-H A DB N DUP(?) C DB ? D DB ?,0 E DB ? F DB 'THE NUMBER IS:$' G DB 0AH,0DH,'$' I DB 'ADDRESS OFFSET:$' DATA DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV E,0 MOV CX,0 MOV SI,0 MOV DI,0 LEA BX,H L1: CMP CX,N JAE PRINT MOV AL,[BX]

MOV D,AL MOV AX,WORD PTR D MOV C,3 DIV C CMP AH,0 JNE L2 MOV AX,WORD PTR D MOV C,13 DIV C CMP AH,0 JNE L2 INC BX INC E MOV A[SI],CL ADD A[SI],30H INC CX INC SI JMP L1 L2: INC BX INC CX JMP L1 PRINT: LEA DX,F MOV AH,9 INT 21H ADD E,30H MOV DL,E MOV AH,2 INT 21H LEA DX,G MOV AH,9 INT 21H L3: CMP DI,SI JAE EXIT LEA DX,I MOV AH,9 INT 21H DL,A[DI] MOV DL,A[DI] MOV AH,2 INT 21H LEA DX,G MOV AH,9 INT 21H INC DI JMP L3

EXIT: MOV AH,4CH INT 21H CODE ENDS END START 输出: IS: 输出:THE NUMBER IS: 2 ADDRESS OFFSET:3 ADDRESS OFFSET:5 (3)基址变址寻址: (3)基址变址寻址: 基址变址寻址 寄存器分配的流程图( 寄存器分配的流程图(2)基本类似。 基本类似。 但是: 但是: 为首址各变量的偏移量。 DI 还作为以 H 为首址各变量的偏移量。 的地址。 BX 只存储 H 的地址。

代码: 代码: STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT H DB 3,5,7,78,13,39 N=$N=$-H A DB N DUP(?) C DB ? D DB ?,0 E DB ? F DB 'THE NUMBER IS:$' NUMBER G DB 0AH,0DH,'$' I DB 'ADDRESS OFFSET:$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV E,0 MOV CX,0 MOV SI,0 MOV DI,0 LEA BX,H L1: CMP CX,N JAE PRINT

MOV AL,[BX+DI] MOV D,AL MOV AX,WORD PTR D MOV C,3 DIV C CMP AH,0 JNE L2 MOV AX,WORD PTR D C,13 MOV C,13 DIV C CMP AH,0 JNE L2 INC DI INC E MOV A[SI],CL ADD A[SI],30H INC CX INC SI JMP L1 L2: INC DI INC CX JMP L1 PRINT: LEA DX,F MOV AH,9 INT 21H ADD E,30H MOV DL,E MOV AH,2 INT 21H LEA DX,G MOV AH,9 INT 21H MOV DI,0 L3: CMP DI,SI JAE EXIT LEA DX,I MOV AH,9 INT 21H MOV DL,A[DI] MOV AH,2 INT 21H LEA DX,G MOV AH,9 INT 21H

INC DI JMP L3 EXIT: MOV AH,4CH INT 21H CODE ENDS END START

输出: IS: 输出:THE NUMBER IS: 2 ADDRESS OFFSET:3 ADDRESS OFFSET:5 为首地址的字节单元中,要求用下列方法分别编程, 2. 键盘接受一串字符到 BUF 为首地址的字节单元中,要求用下列方法分别编程, 将它们以相反的次序显示在屏幕的下一行中: 将它们以相反的次序显示在屏幕的下一行中: 按地址从尾向前依次显示。 (1) 按地址从尾向前依次显示。 利用堆栈反向显示。 (2) 利用堆栈反向显示。 (3) 利用交换的方法反序后,然后显示:即 ai<->aj 利用交换的方法反序后, 然后显示: ai<解: 代码: 代码: STACK SEGMENT STACK DUP(?) DB 100 DUP(?) STACK ENDS DATA SEGMENT BUF DB 100 DB ? DB 100 DUP(?) DATA ENDS CODE SEGMENT CS:CODES,DS:DATAS,SS:STACKS ASSUME CS:CODES,DS:DATAS,SS:STACKS AX,DATAS START : MOV AX,DATAS MOV DS,AX LEA DX,BUF MOV AH,10 INT 21H MOV DL,0AH MOV AH,2 INT 21H MOV BL,BUF+1

MOV BH,0 DEC BX L1: MOV DL,[BUF+2][BX] MOV AH,2 INT 21H DEC BX CMP BX,0 JGE JGE L1 EXIT: MOV AH,4CH INT 21H CODE ENDS END START 输出:dadasd(输入) 输出:dadasd(输入) 输入 dsadad(结果 结果) dsadad(结果) (2).利用堆栈反向显示。 (2).利用堆栈反向显示。 利用堆栈反向显示 寄存器分配: 寄存器分配: BX:作为 为首地址的存储区的地址指针,也存储循环最大次数。 BX:作为 BUF+2 为首地址的存储区的地址指针,也存储循环最大次数。 CX:循环计数器及暂存数据。 CX:循环计数器及暂存数据。 代码: 代码: STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT BUF DB 100 DB ? DB 100 DUP(?) A DW ? DATA ENDS CODE SEGMENT CS:CODES,DS:DATAS,SS:STACKS ASSUME CS:CODES,DS:DATAS,SS:STACKS AX,DATAS START: MOV AX,DATAS MOV DS,AX LEA DX,BUF MOV AH,10 INT 21H MOV DL,0AH MOV AH,2 INT 21H MOV BX,0 MOV CL,BUF+1

MOV CH,0 MOV A,CX MOV CX,0 L1: CMP BX,A JAE L2 MOV AL,[BUF+2][BX] CBW PUSH AX INC BX JMP L1 L2: CMP CX,BX JAE EXIT POP DX MOV AH,2 INT 21H INC CX JMP L2 EXIT: MOV AH,4CH INT 21H CODE ENDS END START 输出:dadasd(输入) 输出:dadasd(输入) dsadad(结果 结果) dsadad(结果)

(3)利用交换的方法反序后,然后显示: ai<—— ——>aj (3)利用交换的方法反序后,然后显示:即 ai<——>aj 利用交换的方法反序后 寄存器分配: 寄存器分配: 为首地址的存储区的地址指针,与临时存放数据。 BX: 作为 BUF+2 为首地址的存储区的地址指针,与临时存放数据。 CL:与临时存放数据。 CL:与临时存放数据。 SI: 为首址的地址指针。 SI:以 BUF+2 为首址的地址指针。 代码: 代码: STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS DATA SEGMENT BUF DB 100 DB ? DB 100 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK

START : MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,10 INT 21H MOV DL,0AH MOV AH,2 INT 21H MOV SI,0 MOV BL,BUF+1 MOV BH,0 DEC BX L1: MOV CL,[BUF+2][BX] CMP [BUF+2][SI],CL JZ PRINT MOV CL,[BUF+2][BX] XCHG [BUF+2][SI],CL [BUF+2][BX],CL MOV [BUF+2][BX],CL DEC BX INC SI JMP L1 PRINT: MOV BL,BUF+1 MOV BH,0 MOV [BUF+2][BX],'$' LEA DX,BUF+2 MOV AH,9 INT 21H EXIT: MOV AH,4CH INT 21H CODE ENDS END START 输出:dadasd(输入 输入) 输出:dadasd(输入) dsadad(结果 结果) dsadad(结果) 11.数据段定义如下: 11.数据段定义如下: DATA SEGMENT TV' STRING DB ‘The Personal Computer& TV' DATA ENDS 用字符串操作等指令完成以下功能: 用字符串操作等指令完成以下功能:

(1) 把该字符串传送到附加段中偏移量为 GET_CHAR 开始的内存单元中

比较该字符串是否与' computer'相同, (2) 比较该字符串是否与'The computer'相同,若相同则将 AL 寄存器的内容 置 1, 否则置 0,并将比较次数送到 BL 寄存器 检查该字符串是否有' (3) 检查该字符串是否有'&'符,若有则用空格符替换 开始的单元中, (4) 把大写字母传送到附加段中以 CAPS 开始的单元中, 其余字符传送到以 CHART 开始的单元,然后将数据段中存储上述字符串的单元清零。 开始的单元,然后将数据段中存储上述字符串的单元清零。 解: (1) CLD LEA SI,STRING LEA DI,GET_CHAR MOV CX,26 REP MOVSB (2)补充在附加数据段定义 (2)补充在附加数据段定义 computer' STRING1 DB ‘The computer' MOV AL,1 CLD LEA SI,STRING LEA DI,STRING1 MOV CX,12 REPZ CMPSB JCXZ SKIP MOV AL,0 SKIP: MOV BX,12 SUB BX,CX (3) CLD MOV AL,'&' LEA DI,STRING MOV CX,26 NEXT: REPNE SCASB JCXZ SKIP PTR [DIMOV BYTE PTR [DI-1],' ' LOOP NEXT SKIP: (4) LEA SI,STRING LEA DI,CAPS LEA BX,CHART MOV CX,26 NEXT: MOV AL, [SI] AL,' CMP AL,'A'

JB OTHER AL,' CMP AL,'Z' JA OTHER MOV ES:[DI],AL INC DI JMP SKIP OTHER: MOV ES:[BX],AL INC BX SKIP: MOV BYTE PTR[SI],0 INC SI LOOP NEXT 12. 寄存器中, 12. 编程将 AX 寄存器的内容以相反的次序传送到 DX 寄存器中,并要求 AX 中的 内容不被 破坏, 寄存器中' 破坏,然后统计 DX 寄存器中'1'的个数 答:MOV BL,0 PUSH AX MOV DX,0 MOV CX,16 NEXT: SHL AX,1 JNC SKIP INC BL SKIP:RCR DX,1 LOOP LOOP NEXT STOP:POP AX

第二次上机作业

13.将键盘上输入的十六进制数转换成十进制数,在屏幕上显示。 13.将键盘上输入的十六进制数转换成十进制数,在屏幕上显示。 解: DATA SEGMENT STRING DB 'INPUT 4 HEX NUM:',0AH,0DH,'$' NUM DB 10 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX,DATA DS,AX MOV DS,AX LEA DX,STRING ;显示提示信息 MOV AH,9 INT 21H MOV BP,4 MOV DX,0 CONT: MOV CL,4 ;输入 4 位十六进制数到 DX

D1:

A1:

SHL DX,CL MOV AH,1 INT 21H CMP AL,'0' JB D1 CMP AL,'F' JA D1 CMP AL,'A' JB A1 SUB AL,7 SUB AL,30H MOV AH,0 ADD DX,AX DEC BP JNZ CONT MOV SI,0

转换成十进制数, ;将 DX 转换成十进制数,再转换成 ASCII 码到

NUM MOV AX,DX MOV MOV DX,0 MOV BX,10 D2: DIV BX ADD DL,30H MOV NUM[SI],DL INC SI CMP AX,0 JZ EXIT MOV DX,0 JMP D2 EXIT: MOV DL,0AH MOV AH,2 INT 21H DL,0DH MOV DL,0DH INT 21H D3: DEC SI MOV DL,NUM[SI] MOV AH,2 INT 21H JNZ D3 MOV AH,4CH INT 21H CODE ENDS END START

;显示十进制数

22.编程序统计学生的数学成绩, 22.编程序统计学生的数学成绩,分别归类 90 分-99 分,80 分-89 分,70 分-79

分一下,并将各段的人数送入内存单元中。 分,60 分-69 分及 60 分一下,并将各段的人数送入内存单元中。 解: DATA SEGMENT BUFF DB XXH,....... SANUM EQU S-BUFF SNUM DB 5 DUP(0) ;存放各类成绩统*峁 BUFF1 DB ANUM DUP(0) ;存放 60 分以下的成绩 BUFF2 DB ANUM DUP(0) ;存放 60~69 分的成绩 BUFF3 DB ANUM DUP(0) ;存放 70~79 分的成绩 BUFF4 DB ANUM DUP(0) ;存放 80~89 分的成绩 BUFF5 DB ANUM DUP(0) ;存放 90 分以上的成绩 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CL,ANUM ;取学生人数 MOV CH,0 MOV BH,0 MOV SI,OFFSET BUFF MOV DI,OFFSET SNUM DI: MOV AL,[SI] CMP AL,60H JAE NEXT1 MOV BL,[DI] MOV BUFF1[BX],AL INC BYTE PTR[DI] JMP NEXT5 NEXT1: CMP AL,69H JA NEXT2 MOV MOV BL,[DI+1] MOV BUFF2[BX],AL INC BYTE PTR[DI+1] JMP NEXT5 NEXT2: CMP AL,79H JA NEXT3 MOV BL,[DI+2] MOV BUFF2[BX],AL INC BYTE PTR[DI+2] JMP NEXT5 NEXT3: CMP AL,89H JA NEXT4

MOV BL,[DI+3] MOV BUFF3[BX],AL INC BYTE PTR[DI+3] JMP NEXT5 NEXT4: MOV BL,[DI+4] MOV BUFF4[BX],AL INC BYTE PTR[DI+4] NEXT5: INC SI LOOP DI MOV AH,4CH INT 21H CODE ENDS END START


相关推荐

最新更新

猜你喜欢