LEA DX, A
MOV AH, B
INT 21H
ENDM
DATASEGMENT USE16
BUF1DB60
DB?
DB60 DUP(?)
BUF2DB60
DB?
DB60 DUP(?)
STR1 DB0DH,0AH,'$'
STR2 DB'success!$'
STR3 DB 'Your telephone number is not match, please try again.$'
STR4DB'Please input your telephone number:$'
STR5DB'Please input your telephone number again:$'
DATAENDS
STACK SEGMENT USE16 STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT USE16
ASSUME DS:DATA, ES:DATA, CS:CODE, SS:STACK
START:
MOV AX, DATA
MOV DS, AX
MOV ES, AX
LOOP1: RW STR4, 9输出Please input your telephone number:
RW BUF1, 10 输入号码
RW STR1, 9回车换行
RW STR4, 9输出Please input your telephone number again:
RW BUF2, 10 输入号码
RW STR1, 9回车换行
MOV CL, BUF1[1]
CMP CL, BUF2[1] 比较输入的号码位数是否一样
JNE NO
MOVSX CX, CL
MOV SI, OFFSET BUF1[2]
MOV DI, OFFSET BUF2[2]
CLD
REPZ CMPSB 比较输入的号码是否相同
JNE NO
RW STR2, 9 输出success!
JMP EXIT
NO: RW STR3, 9 输出Your telephone number is not match, please try again.
RW STR1, 9回车换行
JMP LOOP1
EXIT: MOV AH, 4CH
INT 21H
CODE ENDS
END START
data segment
org 2000h
str1 db 'Aedc123!*sdeDIO71$'
count equ $-str1
org 2018h
str2 db count dup(?)
data ends
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: mov ax,data
MOV DS,AX
lea si,str1
lea di,str2
mov cx,count
l0:mov al,61H
cmp ds:[si],al
jl l1
mov al,7aH
cmp al,ds:[si]
jl l1
mov al,ds:[si]
sub al,20h
mov ds:[di],al
jmp l2
l1: mov al,ds:[si]
mov ds:[di],al
l2:inc si
inc di
loop l0
mov dx,offset str1
mov ah,9
int 21h
mov dx,offset str2
mov ah,9
int 21h
mov ah,4ch
int 21h
CODE ENDS
END START
我随便举了一个数据段的例子
所谓分支程序,其实就是将函数的地址放在一组数据中,根据不同的条件跳转到这些地址入口执行程序。方法有几种,比如,以下就是利用跳转指令将地址组合在一起实现的方法之一。MEMORYM:
LCALL CHGRAM11内存选择,确定内存区域,这里省略
MOV DPTR,#ST0函数入口地址组合首地址
CLR C
DEC A调用参数,以下计算入口地址
MOV R7,A
RLC A
ADD A,R7
JMP @A+DPTR跳转到入口地址
ST0:
LJMP FUNC1 以下为13个函数入口地址,完成不同的功能
LJMP FUNC2
LJMP FUNC3
LJMP FUNC4
LJMP FUNC5
LJMP FUNC6
LJMP FUNC7
LJMP FUNC8
LJMP FUNC9
LJMP FUNC10
LJMP FUNC11
LJMP FUNC12
LJMP FUNC13
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)