发布时间:2024-07-04 17:01
本文汇集北京理工大学大三汇编考试题(***)的部分内容,大部分源于网络,小部分自己修改,谨慎参考。
本文仅用于学习交流,未经本人同意,不得转载。
同时欢迎大家交流讨论,但是考完上机估计我就不想再看这些东西了,男的女的折磨,markdown貌似不支持汇编高亮,就这样吧。注释是我自己乱注的,慎看。
(还是要用冲击3星的梦想的,直接1星总觉得不甘心)
现有一组字符串为data,name,time,file,code,path,user,exit,quit,text,请编写程序从键盘输入4个字符的字符串,若存在将其修改为disk, 并将结果在显示器上显示
这道题还是较为容易的,没想好写啥,一个一个比。注意下
MOV AH,0AH
INT 21H
第一个字节存的是缓冲区最大容量
第二个字节存的是实际字符数
DATAS SEGMENT
BUF1 db 'data,name,file,code,path,user,exit,quit,text','$'
BUF2 db 100
db ?
db 100 dup (?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX ;用di,si就写
;输入字符进入缓冲区
LEA DX,BUF2
MOV AH,0AH
INT 21H
;输入回车,双行数据
MOV DL,0AH
MOV AH,02H
INT 21H
LEA SI,BUF1
LEA DI,BUF2[2]
MOV CH,44 ;字符个数
MOV CL,4 ;一组字符的个数
CLD
ZONGCHULI: ;判断是否比较完所有字符
CMP CH,0
JE END0
NEXTZIMU:
CMPSB
JNE NEXTWORD ;如果第一个字符都不相等,直接跳转到下一个字符
JMP AGAIN ;如果第一个字符相等,继续比较
AGAIN:
DEC CH
DEC CL
CMP CL,0
JNE NEXTZIMU
CALL CHANGE
;INC SI
JMP ZONGCHULI
NEXTWORD:
CMP CL,0 ;CL=0 找到相同的字符串
JE A
INC SI
DEC CL
DEC CH
JMP NEXTWORD
A: MOV CL,04H
; DEC CH
LEA DI,BUF2[2]
JMP ZONGCHULI
CHANGE PROC NEAR
MOV BUF1[SI-4],'d'
MOV BUF1[SI-3],'i'
MOV BUF1[SI-2],'s'
MOV BUF1[SI-1],'k'
MOV CL,04H
LEA DI,BUF2[2]
RET
CHANGE ENDP
END0:
LEA DX,BUF1
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
现有一组字符串为data,name,time,file,code,path,user,exit,quit,text,请编写程序从键盘输入4个字符的字符串,若存在将其删除, 并在显示器上显示。
逐词判断,不同就打印,同就不打印
DATAS SEGMENT
BUF1 db 'data,name,file,code,path,user,exit,quit,text','$'
BUF2 db 100
db ?
db 100 dup(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
LEA DX,BUF2
MOV AH,0AH
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
MOV CH,9H
MOV CL,4H
CLD
LEA SI,BUF1
LEA DI,BUF2[2]
ZONGCHULI:
CMP CH,0
JE END0
NEXTZIMU:
CMPSB
JNZ NEXTWORD
DEC CL
CMP CL,0
JE CHANGE
JMP NEXTZIMU
NEXTWORD:
CMP CL,0 ;CL=0 找到相同的字符串
JE DAYIN
INC SI
DEC CL
;DEC CH
JMP NEXTWORD
DAYIN:
MOV DL,BUF1[SI-5]
MOV AH,02H
INT 21H
MOV DL,BUF1[SI-4]
MOV AH,02H
INT 21H
MOV DL,BUF1[SI-3]
MOV AH,02H
INT 21H
MOV DL,BUF1[SI-2]
MOV AH,02H
INT 21H
CMP BUF1[SI-1],'$'
JE END0
MOV DL,BUF1[SI-1]
MOV AH,02H
INT 21H
MOV CL,04H
LEA DI,BUF2[2]
DEC CH
JMP ZONGCHULI
CHANGE:
INC SI
DEC CH
MOV CL,4
LEA DI,BUF2[2]
JMP ZONGCHULI
END0:
MOV AH,4CH
INT 21H
CODES ENDS
END START
在多模块设计中,主模块中调用内部模块buf1,buf2,buf3,buf4。主模块根据键盘输入的指令(如:a,b,c,d)调用上述对应的子程序,每个子程序的任务是显示其入口地址。调用后继续等待调用,若输入ESC键(ASCII码为1BH)则结束程序的执行。请编写完成该任务的程序。
注意END MAIN 和十六进制显示
DATAS SEGMENT
BUF DW BUF1,BUF2,BUF3,BUF4
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;编写主程序
MAIN PROC NEAR ;FAR??
START:
MOV AX,DATAS
MOV DS,AX
L: MOV AH,01H
INT 21H
;和ESC键比较
CMP AL,1BH
JE END0
;关键字比较
CMP AL,'a'
JE ISA
CMP AL,'b'
JE ISB
CMP AL,'c'
JE ISC
CMP AL,'d'
JE ISD
JMP L ;寻找下一个关键字
ISA:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
;换行回车/ENTER
CALL BUF1 ;调用buf1子程序
JMP L
ISB:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
;换行回车/ENTER
CALL BUF2 ;调用buf2子程序
JMP L
ISC:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
;换行回车/ENTER
CALL BUF3 ;调用buf3子程序
JMP L
ISD:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
;换行回车/ENTER
CALL BUF4 ;调用buf4子程序
JMP L
END0:
MOV AH,4CH
INT 21H
RET
MAIN ENDP
BUF1 PROC NEAR
MOV BX,OFFSET BUF1 ;BX真的稳
CALL DISP ;调用显示程序
RET
BUF1 ENDP
BUF2 PROC NEAR
MOV BX,OFFSET BUF2 ;BX真的稳
CALL DISP ;调用显示程序
RET
BUF2 ENDP
BUF3 PROC NEAR
MOV BX,OFFSET BUF3 ;BX真的稳
CALL DISP ;调用显示程序
RET
BUF3 ENDP
BUF4 PROC NEAR
MOV BX,OFFSET BUF4 ;BX真的稳
CALL DISP ;调用显示程序
RET
BUF4 ENDP
;显示
DISP PROC NEAR
MOV CH,4 ;16b
L1:
MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH ;取低四位
CMP AL,9
JBE SHUZI
ADD AL,7 ;字母+7
SHUZI:
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
DEC CH
CMP CH,0
JNZ L1
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
RET
DISP ENDP
CODES ENDS
;个人猜测 定义主程序要把END START 换成END MAIN
END MAIN
现有一控制程序共5个工序,要求输入0-4的序号,分别执行各工序的子程序,每个子程序的任务是显示其入口地址。调用后继续等待调用,按回车则结束程序的执行。
上题改一改就完事了
DATAS SEGMENT
BUF DW BUF1,BUF2,BUF3,BUF4,BUF5
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;编写主程序
MAIN PROC NEAR ;FAR??
START:
MOV AX,DATAS
MOV DS,AX
L: MOV AH,01H
INT 21H
;和回车键比较
CMP AL,0DH
JE END0
;关键字比较
CMP AL,'0'
JE ISA
CMP AL,'1'
JE ISB
CMP AL,'2'
JE ISC
CMP AL,'3'
JE ISD
CMP AL,'4'
JE ISE
JMP L ;寻找下一个关键字
ISA:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
;换行回车/ENTER
CALL BUF1 ;调用buf1子程序
JMP L
ISB:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
;换行回车/ENTER
CALL BUF2 ;调用buf2子程序
JMP L
ISC:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
;换行回车/ENTER
CALL BUF3 ;调用buf3子程序
JMP L
ISD:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
;换行回车/ENTER
CALL BUF4 ;调用buf4子程序
JMP L
ISE:
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
;换行回车/ENTER
CALL BUF5 ;调用buf4子程序
JMP L
END0:
MOV AH,4CH
INT 21H
RET
MAIN ENDP
BUF1 PROC NEAR
MOV BX,OFFSET BUF1 ;BX真的稳
CALL DISP ;调用显示程序
RET
BUF1 ENDP
BUF2 PROC NEAR
MOV BX,OFFSET BUF2 ;BX真的稳
CALL DISP ;调用显示程序
RET
BUF2 ENDP
BUF3 PROC NEAR
MOV BX,OFFSET BUF3 ;BX真的稳
CALL DISP ;调用显示程序
RET
BUF3 ENDP
BUF4 PROC NEAR
MOV BX,OFFSET BUF4 ;BX真的稳
CALL DISP ;调用显示程序
RET
BUF4 ENDP
BUF5 PROC NEAR
MOV BX,OFFSET BUF5 ;BX真的稳
CALL DISP ;调用显示程序
RET
BUF5 ENDP
;显示
DISP PROC NEAR
MOV CH,4 ;16b
L1:
MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH ;取低四位
CMP AL,9
JBE SHUZI
ADD AL,7 ;字母+7
SHUZI:
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H
DEC CH
CMP CH,0
JNZ L1
MOV DL,0AH
MOV AH,02H
INT 21H
MOV DL,0DH
MOV AH,02H
INT 21H
RET
DISP ENDP
CODES ENDS
;个人猜测 定义主程序要把END START 换成END MAIN
END MAIN
一个有符号字数组以0为结束标志,编程求这个数组的最大值、 最小值、平均值。
难点在于平均值的求取,有空补上详细思路
DATAS SEGMENT
BUF DW 6FFFH,7FFFH,0
MAX DW 0000H
MIN DW 0000H
EVA DW 0000H
NUM DW 16
OPT DB 'THE MAX IS '
OMAX DB '0000H',0DH,0AH,'THE MIN IS '
OMIN DB '0000H',0DH,0AH,'THE EVA IS '
OEVA DB '0000H$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
MAIN PROC NEAR
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
CALL FMAX
CALL FMIN
CALL FEVA
CALL TRAN
LEA DX,OPT
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
FMAX PROC NEAR
MOV AX,BUF
LEA BX,BUF+2
F1: MOV DX,[BX]
CMP DX,0
JE EMAX
CMP AX,DX
JG NMAX
MOV AX,DX
NMAX:
ADD BX,2
JMP F1
EMAX:
MOV MAX,AX
RET
FMAX ENDP
FMIN PROC NEAR
MOV AX,BUF
LEA BX,BUF+2
F2: MOV DX,[BX]
CMP DX,0
JZ EMIN
CMP AX,DX
JL NMIN
MOV AX,DX
NMIN:
ADD BX,2
JMP F2
EMIN:
MOV MIN,AX
RET
FMIN ENDP
FEVA PROC NEAR
MOV AX,BUF
MOV CX,1
;MOV DX,0
MOV DI,0
LEA SI,BUF+2
F3:
MOV BX,[SI]
CMP BX,0
JE EEVA
JG NF3
ADD DI,1
NF3:
ADD AX,BX
ADC DX,0
ADD SI,2
INC CX
JMP F3
EEVA:
SUB DX,DI
IDIV CX
MOV EVA,AX
RET
FEVA ENDP
TRAN PROC NEAR
MOV AX,MAX
LEA BX,OMAX+3
CALL TRANS
MOV AX,MIN
LEA BX,OMIN+3
CALL TRANS
MOV AX,EVA
LEA BX,OEVA+3
CALL TRANS
RET
TRAN ENDP
TRANS PROC NEAR
MOV CX,4
L1:
MOV DX,0
DIV NUM
CMP DL,9
JNA NEXT
ADD DL,7
NEXT:
ADD [BX],DL
DEC BX
LOOP L1
RET
TRANS ENDP
CODES ENDS
END MAIN
在BUFFER中定义了的十个带符号字,将其中的负数变成绝对值,并以十进制方式输出。
没啥好说的,看第五题
ASSUME CS:CODES,DS:DATAS
DATAS SEGMENT
BUFFER DW 0FFFEH,-5555,-4444,-3333,-2222,-1111,0,11111,22222,5333
;10个数20个字节
RST DB 5 DUP(?);14H开始
KONG DB 0DH,0AH,'$';用于显示回车换行
DATAS ENDS
CODES SEGMENT
START:
MOV AX,DATAS
MOV DS,AX
MOV SI,0;与BUFFER配合使用用来处理数据
MOV CX,10
COMP:
MOV DI,0;指向RST的第一位
CMP BUFFER[SI],0
JGE ISPOS;判断是否为非负数
NEG BUFFER[SI];如果是负数执行这步,如果不是跳过去
ISPOS:
MOV BX,10
MOV AX,BUFFER[SI];将待处理的数移入AX
TOTEN:
;CWD;扩展成双字型数据(AX)->(DX)+(AX)相当于把(DX)清零
MOV DX,0
DIV BX;(BX) = 0AH相当于不断除以10余数保存在DX里
;AND DL,0FH;0FH = 1111B
ADD DL,30H;(DL)+30H转换为asc码
MOV RST[DI],DL;保存asc码
INC DI
CMP AX,0;字符是否全部处理完
JNE TOTEN
PRINT:
DEC DI;因为四个数字都是一样的
MOV DL,RST[DI]
MOV AH,02H;显示
INT 21H
CMP DI,0
JNE PRINT;打印这5个字节的asc码
LEA DX,KONG;显示回车换行
MOV AH,09H
INT 21H
ADD SI,2;处理下一个字节
LOOP COMP
MOV AH,4CH
INT 21H
CODES ENDS
END START
已知数组A包含20个互不相等的字型整数,数组B包含30个互不相等的字型整数,试编制一程序把在A中而不在B中出现的整数放于数组C中。
一个一个比 这个简单 清0 永远滴神
DATAS SEGMENT
BUFA DW 0000H,0011H,0022H,0033H,0044H,0055H,0066H,0077H,0088H,0099H;不加,
DW 7777H,7777H,7777H,7777H,7777H,7777H,7777H,7777H,7777H,7777H
BUFB DW 0000H,0011H,0022H,0033H,0044H,0055H,0066H,0077H,0088H,0099H
DW 1011H,1022H,1033H,1044H,1055H,1066H,1077H,1088H,1099H,1000H
DW 2011H,2022H,2033H,2044H,2055H,2066H,2077H,2088H,2099H,2000H
BUFC DW 20 DUP(0) ;最多就是20
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
;清0,YYDS
MOV SI,0
MOV DI,0
MOV BX,0
;清0,YYDS
COMPARE:
MOV AX,BUFA[SI]
MOV CX,BUFB[DI]
CMP AX,CX
JNE BNEXT
ANEXT:
ADD SI,2
CMP SI,40
JE END0
MOV DI,0
JMP COMPARE
BNEXT:
ADD DI,2
CMP DI,60
JE LOADC
JMP COMPARE
LOADC:
MOV BUFC[BX],AX
ADD BX,2
JMP ANEXT
END0:
MOV AH,4CH
INT 21H
CODES ENDS
END START
已知数组A包含20个互不相等的字型整数,数组B包含30个互不相等的字型整数,试编制一程序把既在A中又在B中出现的数存放于数组C中。
同上吧,感觉没什么复杂逻辑
DATAS SEGMENT
BUFA DW 0000H,0011H,0022H,0033H,0044H,0055H,0066H,0077H,0088H,0099H;不加,
DW 7777H,7777H,7777H,7777H,7777H,7777H,7777H,7777H,7777H,7777H
BUFB DW 0000H,0011H,0022H,0033H,0044H,0055H,0066H,0077H,0088H,0099H
DW 1011H,1022H,1033H,1044H,1055H,1066H,1077H,1088H,1099H,1000H
DW 2011H,2022H,2033H,2044H,2055H,2066H,2077H,2088H,2099H,2000H
BUFC DW 20 DUP(0) ;最多就是20
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
;清0,YYDS
MOV SI,0
MOV DI,0
MOV BX,0
;清0,YYDS
COMPARE:
MOV AX,BUFA[SI]
MOV CX,BUFB[DI]
CMP AX,CX
JE LOADC
JMP BNEXT
BNEXT:
ADD DI,2
CMP DI,60
JE ANEXT
JMP COMPARE
ANEXT:
ADD SI,2
CMP SI,40
JE END0
MOV DI,0
JMP COMPARE
LOADC:
MOV BUFC[BX],AX
ADD BX,2
JMP ANEXT
END0:
MOV AH,4CH
INT 21H
CODES ENDS
END START
判断一个不超过65535的整数是否为质数。
判断质数的方法:
DATAS SEGMENT
BUF DW 8
YES DB 'YES','$'
NO DB 'NO','$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV BX,BUF
CMP BX,2
JBE SHI ;小于等于2 必定是质数
DEC BX ;BX-1
LOOP1:
CMP BX,1
JE SHI
MOV AX,BUF
MOV DX,0
DIV BX
CMP DX,0
JE BUSHI
DEC BX
JMP LOOP1
BUSHI:
LEA DX,NO
MOV AH,9
INT 21H
JMP END0
SHI:
LEA DX,YES
MOV AH,9
INT 21H
JMP END0
END0:
MOV AH,4CH
INT 21H
CODES ENDS
END START
在内存中定义一个用于加密的key和明文字符串,key中的每个数字表示将明文字符串中的对应字符进行旋转移位的次数,负数表示左移位,正数表示右移位。加密key的长度为10个字节:-2, 4, 1, 0, -3, 5, 2, -4, -4, 6。先用加密key处理字符串的前10个字节,再处理接下来的10个字节,以此类推。将密文字符串保存在另一个变量中。
暂无 待补充
DATAS SEGMENT
BUF1 DB 'ABCDEFGHIJABCDEFGHIJ'
l1 equ $-BUF1
BUF2 DB -2,4,1,0,-3,5,2,-4,-4,6
l2 db 10
BUF3 DB 100 DUP(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV SI,0
MOV DI,0
MOV BH,l1
MOV BL,l2
L:
MOV AH,BUF1[SI]
MOV AL,BUF2[DI]
CMP AL,0
JL ZUO
MOV CL,AL
ROR AH,CL
MOV BUF3[SI],AH
JMP NEXT
ZUO:
NEG AL
MOV CL,AL
ROL AH,CL
MOV BUF3[SI],AH
JMP NEXT
NEXT:
DEC BL
DEC BH
CMP BH,0
JE END0
INC SI
CMP BL,0
JE L3
INC DI
JMP L
L3:
MOV DI,0
MOV BL,l2
JMP L
END0:
MOV AH,4CH
INT 21H
CODES ENDS
END START
在内存中定义一个用于加密的key和明文字符串,用这个key的每个字符依次和明文字符串的对应字符进行异或操作得到密文字符串,并将密文字符串保存在另一个变量中。例如:key为“ABXmv#7”
最简单的一道,没啥说的,再补充吧
DATAS SEGMENT
BUF1 DB 'ABCDEFGHIJ'
l1 equ $-BUF1
BUF2 DB 'ABXmv#7'
l2 equ $-BUF2
BUF3 DB 100 DUP(?)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV SI,0
MOV DI,0
CHULI
MOV AH,BUF1[SI]
MOV AL,BUF2[DI]
XOR AH,AL
MOV BUF3[SI],AH
INC SI
CMP SI,l1
JE END0
INC DI
CMP DI,l2
JE HUI
JMP CHULI
HUI:
MOV DI,0
JMP CHULI
ENDO:
MOV AH,4CH
INT 21H
CODES ENDS
END START
【docker】docker学习(2)——docker私有仓库Harbor部署、上传下载镜像至harbor仓库实战
为什么 React 的 Diff 算法不采用 Vue 的双端对比算法?
【完美解决】RuntimeError: one of the variables needed for gradient computation has been modified by an inp
【用pandas_alive几行代码绘制竞赛动图】二、专栏学习说明(配置好的venv虚拟环境+拿来即用测试代码+测试数据集+参数api解析)
7月12日科技资讯|小鹏员工承认备份特斯拉源代码;Apple Watch 现漏洞;Python 3.7.4 发布