此要点托管所有必需的文件。我将首先解释我在这里做什么。
客观的
该程序应读取两个不同长度的单独字符串,小于 200,以换行符终止。读取字符串后,搜索两个字符串中的任何一个是否是另一个字符串的子字符串。如果两者相同;返回真。
返回值
TRUE
:其中一个字符串是子字符串。FALSE
: 两个字符串完全不同。
程序
我在我的程序中做的是:
- 将字符串读入变量
STR1
并STR2
调用过程READ_STR
。该过程返回 BX 中字符串的长度。我将第一个字符串的长度存储在另一个L1
类型的变量中DW
。 BX
将第二个字符串(现在在 中)的长度与 进行比较L1
。- 如果两者相等,则设置
CX
为 1 - 其他设置
CX = abs.( BX - L1 )
| 绝对的BX - L1
。
这是为了设置一个较小的字符串可以在较大的字符串中迭代多少次。将 to设置
DI
为指向较长的字符串。- 如果两者相等,则设置
- 设置
L1
为较小字符串的长度。 - 设置
DX
为 0。使用CX
上面设置的值启动循环。 - 添加
DX
到DI
并用于CMPSB
比较较短的字符串SI
和较长的字符串DI
。更新CX
以便L1
可以REPE CMPSB
工作。 DX
如果搜索失败则增加。重置和。CX
_ 减1 后从第 4 步开始(通过使用操作完成)。DI
SI
CX
LOOP
一些输出
由于以下语句(第 #72 和 #73 行),第三个输出中有一个额外的行。调用DISP_STR
失败。
NEWLINE
CALL DISP_STR
代码
程序ASM
TITLE Assignment: Read two strings and ...
.MODEL SMALL
SAVE_REG MACRO REGS
IRP D, <REGS>
PUSH D
ENDM
ENDM
LOAD_REG MACRO REGS
IRP D, <REGS>
POP D
ENDM
ENDM
END_DOS MACRO
MOV AH, 76
INT 21H
ENDM
NEWLINE MACRO
SAVE_REG <AX, DX>
MOV AH, 2
MOV DL, 0AH
INT 21H
MOV DL, 0DH
INT 21H
LOAD_REG <DX, AX>
ENDM
.STACK 100H
.DATA
STR1 DB 200 DUP(65)
STR2 DB 200 DUP(0)
PROMPT DB "Enter string "
NUM DB "1: $"
L1 DW 0
UNEQL DB "No substring found$"
EQUAL DB "Substring was found$"
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV ES, AX
MOV AH, 9
LEA DX, PROMPT
INT 21H
LEA DI, STR1
CALL READ_STR
MOV L1, BX
NEWLINE
MOV NUM, '2'
INT 21H
CALL READ_STR
LEA SI, STR1
LEA DI, STR2 ; DI stores the longer string
CMP L1, BX
JE EQL
CMP L1, BX
JG INV
MOV CX, BX
SUB CX, L1
JMP COMPARE
INV:
MOV CX, L1
SUB CX, BX
MOV L1, BX
LEA SI, STR2
LEA DI, STR1 ; DI stores longer string
NEWLINE
CALL DISP_STR
JMP COMPARE
EQL:
MOV CX, 1
COMPARE:
XOR DX, DX
TOP:
SAVE_REG <DI, SI>
ADD DI, DX
PUSH CX
MOV CX, L1
REPE CMPSB
JCXZ FOUND
INC DX
POP CX
LOAD_REG <SI, DI>
LOOP TOP
NOT_FOUND:
NEWLINE
LEA DX, UNEQL
MOV AH, 9
INT 21H
END_DOS
FOUND:
POP CX
LOAD_REG <SI, DI>
NEWLINE
LEA DX, EQUAL
MOV AH, 9
INT 21H
END_DOS
MAIN ENDP
INCLUDE READSTR.ASM
INCLUDE DISPSTR.ASM
END MAIN
DISPSTR.ASM
DISP_STR PROC
SAVE_REG <AX, CX, DX, SI>
MOV CX, BX
CLD
MOV AH, 2
DISP_LOOP:
LODSB
MOV DL, AL
INT 21H
LOOP DISP_LOOP
LOAD_REG <SI, DX, CX, AX>
RET
DISP_STR ENDP
READSTR.ASM
READ_STR PROC
SAVE_REG <AX, DI>
XOR BX, BX
CLD
MOV AH, 1
INT 21H
WHILE_LOOP:
CMP AL, 0DH
JE END_WHILE
CMP AL, 08H
JNE STORAGE
DEC BX
DEC DI
JMP NEXT
STORAGE:
STOSB
INC BX
NEXT:
INT 21H
JMP WHILE_LOOP
END_WHILE:
LOAD_REG <DI, AX>
RET
READ_STR ENDP