汇编语言试题~球大神解决呀~~~
发布网友
发布时间:2023-11-01 06:29
我来回答
共2个回答
热心网友
时间:2024-12-05 05:49
DATA SEGMENT
mess1 DB 'Enter keyword:','$'
mess2 DB 'Enter Sentence:','$'
mess3 DB 'Match at location:','$'
mess4 DB 'NOT MATCH.',13,10,'$'
mess5 DB 'H if the sentence',13,10,'$'
change DB 13,10,'$'
stoknin1 label byte
max1 db 10
act1 db ?
stokn1 db 10 p(?)
stoknin2 label byte
max2 db 50
act2 db ?
stokn2 db 50 p(?)
DATA ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODE SEGMENT
;*************************************代码段
main proc far
assume cs:code,ds:data,es:data
START:
push ds
sub AX,AX
sub BX,BX
sub DI,DI
sub SI,SI
push AX ;为返回dos并清空后面要用到的寄存器
MOV AX,DATA
MOV DS,AX
LEA DX,mess1
MOV ah,09
INT 21h ;输出Enter keyword
LEA DX,stoknin1
MOV ah,0ah ;用21号中段的0ah号功能获取关键字
INT 21h
cmp act1,0
je exit ;如果为空直接退出程序
a10:
;********************************输入Sentence并判断
LEA DX,change
MOV ah,09
INT 21h ;输出回程,换行
LEA DX,mess2
MOV ah,09
INT 21h ;输出Enter Sentence:
LEA DX,stoknin2
MOV ah,0ah
INT 21h ;用21号中段的0ah号功能获取句子
MOV AL,act1
CBW
MOV CX,AX ;保存关键字长度到cx
PUSH CX ;cx入栈
MOV AL,act2
cmp AL,0
je a50 ;保存句子长度到al,若句子为空则跳转显示not match
SUB AL,act1
js a50 ;若句子长度小于关键字长度,则跳转显示not match
INC AL
CBW
LEA BX,stokn2 ;将句子的首地址放进BX
MOV DI,0
MOV SI,0
a20:
;****************************************比较,内循环
MOV AH,[BX+DI]
CMP AH,stokn1[SI] ;遇见字符不相等就跳转到a30
jne a30
INC DI
INC SI
DEC CX ;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完
CMP CX,0
je a40
jmp a20
a30:
;*****************************************外循环,BX+1,清空si,di继续内循环比较
INC BX
DEC AL
cmp AL,0
je a50
MOV DI,0
MOV SI,0
POP CX
push CX
jmp a20
a40:
;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出
SUB BX,offset stokn2
INC BX
LEA DX,change
MOV ah,09
INT 21h
LEA DX,mess3
MOV ah,09
INT 21h
CALL btoh
LEA DX,mess5
MOV ah,09
INT 21h
jmp a10
;****************************************二进制转换十六进制
btoh PROC NEAR
MOV CH,4
rotate: MOV CL,4
ROL BX,CL
MOV AL,BL
and AL,0fh
add AL,30h
cmp al,3ah
jl printit
add al,7h
printit:
MOV dl,al
MOV ah,2
int 21h
dec ch
jnz rotate
ret
btoh endp
a50:
;*****************************************显示not match
LEA DX,change
MOV ah,09
INT 21h
LEA DX,mess4
MOV ah,09
INT 21h
jmp a10
exit:
ret
main endp
CODE ENDS
可能不是很恰当,自己改改吧
追问谢谢~~我的专业不是计算机,不过还是开这个课了,程序能不能写的简单一些...
还有 ¥跟$有什么不同么?
热心网友
时间:2024-12-05 05:49
ASSUME CS:CODE, DS:DATA
;--------------------------------------------
DATA SEGMENT
MSG1 DB 'Have. $'
MSG2 DB 'Have not. $'
; STR DB 'SDFSDesdfdfsdTetdfdvxcvdrertgsdvx$'
STR DB 'SDFSDesdfdf¥sdTetdfdvxcvdrertgsdvx$' ;¥=A3A4H
;说明:
;这里有两个STR,应该选择一个,在前面加上分号。
;加上分号后,该行就不起作用了。
;没有加上分号的,将会作为字符串来查找¥
DATA ENDS
;--------------------------------------------
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
LEA SI, STR ;字符串首地址
LOP:
MOV AL, [SI] ;取来一字符
CMP AL, '$' ; = $ ?
JZ NNN ;为$就结束
CMP AL, 0A3H
JNZ NEXT
INC SI
MOV AL, [SI]
CMP AL, '$'
JZ NNN
CMP AL, 0A4H
JZ HAV
NEXT:
INC SI
JMP LOP ;继续查找
;-----------------------------
HAV: LEA DX, MSG1
JMP DISP
NNN: LEA DX, MSG2
DISP:MOV AH, 09
INT 21H
;-----------------------------
MOV AH, 4CH ;结束
INT 21H
CODE ENDS
;--------------------------------------------
END START