微机原理作业与答案第四章1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章汇编语言程序设计
4-2下列程序执行后,寄存器AX BX CX的内容分别是多少?
D SEGMENAT 0202H;定位数据段地址
ORG 0202H ;定位偏移地址
DA_WORD DW 20H
MOV AX,DA_WORD ;(AX)=0020H
MOV BX,OFFSET DA_WORD ;(BX)=0202H
MOV CL,BYTE PTR DA_WORD ;(CL)=20H将变量DA_WOR的属性改变为字节型) MOV
CH,TYPE DA_WORD ;(CH)=2( 变量类型数值)
;( CX)=0220H
4-4试编制一程序,把CHAR中各小写字母分别转换为对应的大写字母,并存放在CHAR 开始的单元中(题目要求:不改变CHAR的内容)
方法1,小写字母转换一个输出显示一个,前3种方法均使用了AL寄存器
D SEGMENT
CHAR1 DB "abcdefghijklmnopqrstuvwxyz"
N EQU $-CHAR1 ; 变量必须先定义后使用,而不能相反
CHAR2 DB N DUP(0);; 不能把此句与上一句对调,CHAR2 DB $-CHAR t ; 的同学这样写,错在哪?CHAR2DB$-CHAR1DUP(0) 是可以的
D ENDS
S SEGMENT STACK
DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S ;ASSUM是伪指令,后面不能写冒号
START: MOV AX,D
MOV DS,AX
;MOV ES,AX ; 只要用到串操作指令且DI
LEA SI,CHAR1 ;MOV SI,OFFSET CHAR1
LEA DI,CHAR2 ; MOV DI,OFFSET CHAR2 MOV CXN, ;$-CHAR1, 不可
以
AGAIN:MOV AL,[SI]
SUB AL,20H ; AND AL,5FH 有的同学是这样实现的
MOV [DI],AL
MOV DL,AL
MOV AH,2
INT 21H ; 从屏幕显示
INC SI
INC DI
LOOP AGAIN
MOV AH,4CH
INT 21H ; ; 不是必须的
C ENDS
END START
方法2:使用通用数据传送指令MOV
D SEGMENT
CHAR1 DB ‘abcdefghijklmnopqrstuvwxyz '
N EQU $-CHAR1 ; 变量必须先定义后使用, 而不能相反
CHAR2 DB N DUP(0); 不能把此句与上一句对调
D ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS ;P126( 代码段和堆栈段是不可少的) C SEGMENT
ASSUME CS:C ,DS:D ,SS:S
START: MOV AX,D
MOV DS,AX
MOV ES,AX ; 只要用到串操作指令且DI
MOV SI,0 ;LEA SI,CHAR1
MOV DI,0 ;LEA DI,CHAR2
MOV CX,N
AGAIN: MOV AL,CHAR1[SI] ; MOV AL,[SI] SUB AL,20H
MOV CHAR2[DI],AL ; MOV [DI],AL
INC SI
INC DI
LOOP AGAIN
MOV AH,4CH
INT 21H ; 不是必须的
C ENDS
END START
第3 种方法: 使用串的读写指令LODSB STOSB D SEGMENT
CHAR1 DB ‘abcdef '
N EQU $-CHAR1
CHAR2 DB $-CHAR1 DUP(0)
D ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS ;P126( 代码段和堆栈段是不可少的) C SEGMENT
ASSUME CS:C,DS:D,SS:S
START: MOV AX,D
MOV DS,AX
MOV ES,AX
MOV SI,0 ;LEA SI,CHAR1
MOV DI,0 ;LEA DI,CHAR2
MOV CX,N
CLD ; 不写( 隐含)也是0(递增)但不能STD AGAIN: LODSB ;执行一次, 隐含修改SI
SUB AL,32
STOSB ;MOV [DI],AL ; 执行一次, 隐含修改DI INC DI
LOOP AGAIN ;LOOP指令只修改ex,不管SI,DI
MOV AH,4CH iNT 21H ; 不是必须的
e ENDs
END sTART 第四种方法2006级,没有显示使用MOVS指令
D sEGMENT
eHAR1 DB "abcdefghijklmnopqrstuvwxyz"
N EQU $-eHAR1 eHAR2 DB N DUP(0) D ENDS
S SEGMENT STAeK DB 200 DUP(0)
S ENDS e SEGMENT
ASSUME eS:e,DS:D,SS:S
START:
MOV Ax,D
MOV DS,Ax
MOV ES,Ax
LEA Si,eHAR1
LEA Di,eHAR2
MOV ex,N
AGAiN:MOVSB ; SUB [Si],20H
DEe Di ; MOVSB
SUB BYTEPTR[Di],20H ;LOOP AGAiN 错在哪里?结果如何?iNe
Di
LOOP AGAiN
MOV AH,4eH iNT 21H e ENDS
END START 方法5: 只用一个地址指针Si
D SEGMENT
eHAR1 DB "abcdefghijklmnopqrstuvwxyz"
N EQU $-eHAR1 eHAR2 DB N DUP(0) D ENDS
S SEGMENT STAeK
DB 200 DUP(0)
S ENDS e SEGMENT
ASSUME CS:C,DS:D,SS:S
START:
MOV AX,D
MOV DS,AX
MOV ES,AX
MOV SI,0
MOV CX,N
AGAINMOV AL,CHAR1[SI];只用一个地址指针,SI[CHAR1]是错误的
SUB AL,20H
MOV CHAR2[SI],AL
INC SI
LOOP AGAIN
int 3
MOV AH,4CH
INT 21H
C ENDS
END START
有的同学按数据是由键盘录入的来考虑的,也可行,程序中还有不少问题
方法6:由键盘输入小写字母再转换输出, 回车符也占一个字节,输入需要小写转换成大写字母的内容从输入串的第3 个元素开始
D SEGMENT
A DB"CHAR1",0DH,0AH,"$"
B DB"CHAR2",0DH,0AH,"$"
CHAR1 DB 11,?,11 DUP(0); 准备输入1 0个小写字母
CHAR2 DB 10 DUP(0)
D ENDS
S SEGMENT STACK
DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S
START:
MOV AX,D
MOV DS,AX
MOV ES,AX
MOV DX,OFFSET A
MOV AH,9
INT 21H
LEA DX,CHAR1
MOV AH,0AH
INT 21H ; 由键盘输入字符串,1 0个字母(显示) , 1 个回车,共
11 个字节
LEA SI,CHAR1[2]
LEA DI,CHAR2
MOV CX,10 ; 需要转换的字符长度为10 个字节AGAIN:MOV AL,[SI]
SUB AL,20H
MOV [DI],AL
INC SI
INC DI
LOOP AGAIN ; 将小写字母字符串转换成大写字母字符串MOV BYTE PTR[DI],0DH
INC DI
MOV BYTE PTR[DI],0AH
INC DI
MOV BYTE PTR[DI],'$' ; 必须指明数据类型
MOV DX,OFFSET CHAR2
MOV AH,9
INT 21H ; 输出'$' 结尾的大写字母字符串int 3
MOV AH,4CH
INT 21H
C ENDS EN
D START
4-6在BUF地址处起,存放有100个字节的字符串,设其中有一个以上的“ A字符,
编程查找出第一个“ A”字符相对起始地址的距离,并将其存入LEN单元。
方法1,经过调试,数据串长N
D SEGMENT
BUF DB 'qasdA%A9F26HsdfhA$#12345678'
DB 'DFGH234546JII2334JI5467OPPAVG'
DB 'ASDFG45667RTY' ; 必须写实际的
N EQU $-BUF
LEN DW 0;为变量LEN保留一个字,必须先定义后使用丄EN DW ?
D ENDS
S SEGMENT STACK
DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S
START: MOV AX,D
MOV DS,AX
MOV ES,AX ; 这条指令是必须的
MOV CX,N
LEA DI,BUF ;MOV DI ,OFFSET BUF MOV AL,41H ;MOV AL, ‘A'
REPNE SCASB ; 有的同学用的比较指令DEC DI ; 不必判断是否找到,一定找到
MOV LENDI ;MOV LEN,[DI]错在哪里?MOV LEN,[DI-1]错在哪里,MOV LEN,OFFSET BUF[DI-1对不对或LEA LEN,BUF[DI-1]
MOV AH,4CH
INT 21H
C ENDS
END START
4-8某程序设置的数据区如下所示,画出该数据段内容在内存中的存放形式(要用十六进制补码表示,按字节组织)
0000H DB1
DB1 DB 12H,34H,0,56H
DW1 DW 78H,90H,0AB46H,1234H
ADR1 DW DB1 ;取变量DB1的偏移地址0004H DW1
ADR2 DW DW1 ;;取变量DW1的偏移地址
AAA DW $-DB1 ;计算当前变量到DB1变量的字节数
BUF DB 5 DUP(O)
DATA ENDS
有的同学认为0AB46H是负数,并取了它的补码
000CH ADR1
000EH ADR2
0010H AAA
0012H BUF
4-10以BUF1和BUF2开头的2个字符串,其长度均为LEN试编程实现:
(1)将BUF1开头的字符串送到BUF2开始的内存空间。
(2)将BUF1开始的内存空间全部清零。
2006 电气同学的答案,最好将题目的两个要求用一个程序实现
D SEGMENT
N EQU LEN ;LEN 是多少?可以这样定义吗?
BUF1 DB N DUP(?) ; 看清题目要求,写出实际内容对存储器初始化,分配内
存空间,不能偷懒
BUF2 DB N DUP(?)
D ENDS
S SEGMENT STACK
DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S
STAR:
MOV AX,D
MOV DS,AX
MOV SI,OFFSET BUF1
MOV DI,OFFSET BUF2
MOV CX,N
PUSH SI
PUSH CX
L1:MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP L1
POP CX
POP SI
L2:MOV SI,0 ;错在哪里?MOV BYTE PTR[SI],0
LOOP L2
MOV AH,4CH
INT 21H
C ENDS
END STAR
经过调试的:方法1:数据段与附加段重叠,利用MOVS指令实现数据传的复制
D SEGMENT
D1 DB ' BUFQWE233459JKGHGFHGF清题目要求,写出实际内容对存储器初始
化,分配内存空间,不能偷懒LEN DB $-D1
D2 DB ' BUF2KSD33459JKGHGFHGF长度与D1 相同
D ENDS
S SEGMENT STACK
DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S
STAR:
MOV AX,D
MOV DS,AX
MOV ES,AX ;附加段与数据段重叠,是允许的
LEA SI,D1
LEA DI,D2
MOV CX,LEN
REP MOVSB
LEA DI,D1
MOV CX,LEN ; 这条语句不能少
MOV AL,00H ; MOV AX,0错在哪?
REP STOSB
MOV AH,4CH
INT 21H
C ENDS
END STAR 经过调试的:方法2;数据段与附加段分开,串读一个写一个实现数据的
传送,再利用串写指令使指定存储区清零
D SEGMENT
D1 DB 'BUF1qasdA%A9F26HsdfhA$#12345678'
LEN EQU $-D1
D ENDS
E SEGMENT
D2 DB "BUF2abcdefghijklmnopqrstuvwxyz0" ; 必须写实际的,
; 与D1 长度相同
E ENDS
S SEGMENT STACK DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S START: MOV AX,D
MOV DS,AX
MOV AX,E
MOV ES,AX
MOV CX,N
LEA SI,D1 ;MOV SI ,OFFSET D1
LEA DI,D2
LP: LODSB
STOSB
LOOP LP ;LOOP只是使CX减1,不改变SI DI LEA DI,D1
MOV CX,N ; 这条语句不能少
MOV AL,00H
REP STOSB
MOV AH,4CH
INT 21H
C ENDS
END START
第3 种做法:传送一个字节清零一个字节,再向下一个字节进行
D SEGMENT
D1 DB ' BUFQWE233459JKGHGFH(看清题目要求,写出实际内容对存储器初始
化,分配内存空间,不能偷懒LEN DB $-D1
D2 DB ' BUF2KSD33459JKGHGFHGF长度与D1 相同
D ENDS
S SEGMENT STACK DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S
STAR: MOV AX,D
MOV D,S AX
MOV ES,AX
LEA SI,D1
LEA DI,D2
MOV C,X LEN
NEXT:MOV AL,[SI]
MOV [DI] ,AL
MOV [SI] ,00H
INC SI
INC DI
LOOP NEXT
MOV AH,4CH
INT 21H
CSEG ENDS
END STAR 方法4;4-10-4 从键盘输入初值,并显示
D SEGMENT
BUF1 DB 101,?,101 DUP(0)
BUF2 DB 100 DUP(0)
BUF3 DB 100 DUP(0)
A D
B 'BUF1',0DH,0AH,'$'
B DB 'BUF2',0DH,0AH,'$'
D ENDS
S SEGMENT STACK
DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S START: MOV AX,D
MOV DS,AX
MOV ES,AX
MOV DX,OFFSET A
MOV AH,9
INT 21H ; 输出显示'BUF1'
MOV DX,OFFSET BUF1
MOV AH,0AH
INT 21H ; 键盘输入字符串
MOV CL,[BUF1+1]; 实际输入的字符串长度送CL,取相应单元的内容需加方括号
MOV CH,0
PUSH CX
CLD
LEA SI,BUF1+2
LEA DI,BUF2
REP MOVSB ; 将输入的字符串传送到BUF2
MOV BYTE PTR[DI],0DH
INC DI
MOV BYTE PTR[DI],0AH
INC DI
MOV BYTE PTR[DI],'$'; 在BUF2末尾输入回车换行和‘ $'
MOV SI,OFFSET BUF3
MOV DI,OFFSET BUF1+2; 取变量的偏移地址,不能加方括号
POP CX
REP MOVSB ; 用BUF3替换BUF1
MOV BYTE PTR[DI],0DH
INC DI
MOV BYTE PTR[DI],0AH
INC DI
MOV BYTE PTR[DI],'$'; 在BUF1末尾输入回车换行和‘ $'
MOV DX,OFFSET A
MOV AH,9
INT 21H ; 输出显示' BUF1'
MOV DX,OFFSET BUF1+2
MOV AH,9
INT 21H ; 输出空格,因为BUF1已经清零了
MOV DX,OFFSET B
MOV AH,9
INT 21H ; 输出显示' BUF2'
MOV DX,OFFSET BUF2
MOV AH,9
INT 21H ; 输出BUF2即键盘输入的内容
MOV AH,4CH
INT 21H
C ENDS
END START
4-14'试编写一程序,找出BUF数据区中带符号数的最大数和最小数,把最大数放到BH单元,把最小数放到BL单元。
D SEGMENT
BUF DB 5 ,90,-45,100,99,,,, ,-12
N EQU $-BUF
D ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S
START: MOV AX,D
MOV DS ,AX
MOV CX,N-1
MOV SI,0
MOV BH,BUF[SI]
MOV BL,BUF[SI]
AGAIN: INC SI
CMP BH,BUF[SI]
JGE NEXT ;JAE NEXT错(无符号数)
MOV BH,BUF[SI]
ABC:LOOP AGAIN ;这句不要也行
NEXT: CMP BL,BUF[SI]
JLE ABC
MOV BL,BUF[SI]
LOOP AGAIN
C ENDS
END START
4-16若AL中的内容为2位压缩的BCD数68H,试编程:(1)将其拆开成非压缩的BCD数,高低位分别存入BH和BL中。
(2)将上述要求的2位BCD码变换成对应的ASCII码,并且存入CH和CL中。
方法
1 ,经过调试的
D SEGMENT
D1 DB 1,2,3
D ENDS
S SEGMENT STACK
DB 10 DUP(?)
S ENDS
C SEGMENT
ASSUME CS:C,SS:S,DS:D
STAR:MOV AX,D
MOV DS,AX
MOV AL,68H
MOV BH,AL
AND AL,0FH
MOV BL,AL ; (BL)是低位非压缩的BCD码
AND BH,OFOH ; ( BH 将是高位非压缩的BCD码
MOV CL,4
SHR BH,CL ; (BH是高位非压缩的BCD码
MOV CL,BL
ADD CL,30H ; (CL)是低位ASCII 码
MOV CH,BH
ADD CH,30H ; (CH 是高位ASCII 码
MOV AH,4CH
INT 21H
C ENDS
END STAR
方法2
D SEGMENT
D1 DB 1,2,3
D ENDS
S SEGMENT STACK
DB 10 DUP(?)
S ENDS
C SEGMENT
ASSUME CS:C,SS:S,DS:D
STAR:MOV AX,D
MOV DS,AX
MOV SI,OFFSET D1
MOV DL,68H
MOV AL,68H
AND AL,0FH
MUL BYTE PTR[SI]
P99
AAM ; 乘法的ASCII 码调整指令,
MOV BL,AL
MOV BH,DL
AND BH,0F0H
MOV CL,4
SHR BH,CL
MOV AL,BH
MUL BYTE PTR[SI]
AAM
MOV BH,AL
MOV CL,BL
ADD CL,30H
MOV CH,BH
ADD CH,30H
C ENDS
END STAR
4-18试用子程序结构编写一程序:从键盘输入一个2位十进制的月份数(01〜12),然后显示出相应的英文缩写名。
提示:根据题目要求实现的功能,可编写用一个主程序MAIN分别调用几个子程序。
(1)INPUT从键盘接收一个2位数,并把它转换为对应的二进制数。
(2)LOCATE把输入的月份数与其英文缩写名(如JAN, FEB MAR APR MAY
JUN等)对应起来,制成一个字符表以便查找。
(3)DISPLAY将找到的缩写字母在屏幕上显示出来,显示可用DOS所提供的显示功
能( INT 21H 的09号功能)。
方法1:与方法2的不同主要在数据表的制定
D SEGMENT
D1 DB "Please input month from the keyboad",0DH,0AH,"$"
D2 DB 3, ?,3 DUP(?); 分配键盘输入缓冲区,回车符占一个字节,但实际输入的字符数中不包含它,即输入2位数至少需预留3个字节的空间,输入完成后,实际输入的字符数为2
D3 DB "ERROR",0DH,0AH,"$"
MONTH0 DB "JAN",0DH,0AH,"$"
DB "FEB" ,0DH,0AH,"$"
DB "MAR" ,0DH,0AH,"$"
DB "APP" ,0DH,0AH,"$"
DB "MAY" ,0DH,0AH,"$"
DB "JUN" ,0DH,0AH,"$"
DB "JUL" ,0DH,0AH,"$"
DB "AUG" ,0DH,0AH,"$"
DB "SEP" ,0DH,0AH,"$"
DB "OCT" ,0DH,0AH,"$"
DB "NOV" ,0DH,0AH,"$"
DB "DEC" ,0DH,0AH,"$"
D ENDS
S SEGMENT STACK
DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S
START:CLD
MOV AX,D
MOV DS,AX
CALL INPUT
CALL LOCATE
CALL DISPLAY
MOV AH,4CH
INT 21H
INPUT PROC NEAR
LEA DX, D1 ;将D1表示的相对地址送DX
MOV AH,9
INT 21H ; 显示‘ Please input month from the keyboad '并换行ww2:LEA DX,D2 ; 输入月份
MOV AH,0AH
INT 21H
LEA DI,D2 ; 将D2表示的相对地址送DI
CMP byte ptr [DI+1],2
JNE ww2 ; 输入的如果不是二位数, 是错误
MOV AH,[DI+2]; 输入的月份高字节(十位数)
MOV AL,[DI+3]; 输入的月份低字节(个位数)
XOR AX,3030H ;将ASCII 码变成BCD码
MOV BX,AX
MOV AL,BH
mov dl,0ah
MUL dl ; 变成二进制数
MOV BH,AL
MOV AL,BL ; 输入的月份低字节(个位数)
ADD AL,BH ;AL=1-12
RET ; 是必须的
INPUT ENDP ;是必须的,INPUT后没有冒号
LOCATE PROC NEAR
DEC AL
CMP AL,0CH
JNC ERROR ; > 12 (正确的情况应该是0-11 ),输入错误
MOV BL,06H
MUL BL
LEA SI,MONTH0
ADD SI,AX
MOV DX,SI;制成一个字符表以便查找。
RET
ERROR:LEA DX,D3将D3表示的相对地址送DX
RET
LOCATE ENDP
DISPLAY PROC NEAR
MOV AH,09H将找到的缩写字母在屏幕上显示出来
INT 21H
RET
DISPLAY ENDP
C ENDS
END START
方法2:数据表的制定与方法1 有所不同
D SEGMENT
D1 DB "Please input month from the keyboad",0DH,0AH,"$"
D2 DB 4, ?,3 DUP(?) ; 准备接收键盘输入, 只输入2个字符,为什么必须设定最大输入字符数为3,算回车符吗?
D3 DB "ERROR",0DH,0AH,"$"
MONTH1 DB 01H
DB "JAN",0DH,0AH,"$"
MONTH2 DB 02H
DB "FEB" ,0DH,0AH,"$"
MONTH3 DB 03H
DB "MAR" ,0DH,0AH,"$"
MONTH4 DB 04H
DB "APP" ,0DH,0AH,"$"
MONTH5 DB 05H
DB "MAY" ,0DH,0AH,"$"
MONTH6 DB 06H
DB "JUN" ,0DH,0AH,"$"
MONTH7 DB 07H
DB "JUL" ,0DH,0AH,"$"
MONTH8 DB 08H
DB "AUG" ,0DH,0AH,"$"
MONTH9 DB 09H
DB "SEP" ,0DH,0AH,"$"
MONTH10 DB 0AH
DB "OCT" ,0DH,0AH,"$"
MONTH11 DB 0BH
DB "NOV" ,0DH,0AH,"$"
MONTH12 DB 0CH
DB "DEC" ,0DH,0AH,"$"
D ENDS
S SEGMENT STACK
DB 200 DUP(0)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,SS:S
START:CLD
MOV AX,D
MOV DS,AX
CALL INPUT
CALL LOCATE
CALL DISPLAY
MOV AH,4CH
INT 21H
INPUT PROC NEAR
LEA DX, D1 ; 将D1 表示的相对地址送DX
CALL DISPLAY
;MOV AH,9
;INT 21H ; 显示‘ Please input month from the keyboad '并换行
ww2:LEA DX,D2 ; 输入月份
MOV AH,0AH
INT 21H
LEA DI,D2 ; 将D2 表示的相对地址送DI
CMP byte ptr [DI+1],2
JNE ww2 ; 输入的如果不是二位数, 是错误
MOV AH,[DI+2]; 输入的月份高字节(十位数)
MOV AL,[DI+3]; 输入的月份低字节(个位数)
XOR AX,3030H ;将ASCII码变成BC[码,高位是1或0
MOV BX,AX
MOV AL,BH
mov dl,0ah
MUL dl ; 变成二进制数
MOV BH,AL
MOV AL,BL ; 输入的月份低字节(个位数)
ADD AL,BH ;AL 中为1-12
RET
INPUT ENDP
LOCATE PROC NEAR
;DEC AL
CMP AL,0DH
JNC ERROR ; > 13,输入错误
LEA DI,MONTH1
BJ: CMP AL,[DI]
JZ DONE
ADD DI,7
JMP BJ
;MOV BL,06H
;MUL BL
;LEA SI,MONTH0
;ADD SI,Ax
;MOV DX,SI; 制成一个字符表以便查找。
; RET
DONE: INC DI
MOV DX,DI ; 将D3 表示的相对地址送DX
JMP DONE1
ERROR:LEA DX,D3
DONE1: RET
LOCATE ENDP
DISPLAY PROC NEAR
MOV AH,09H; 将找到的缩写字母在屏幕上显示出来
INT 21H
RET
DISPLAY ENDP C ENDS
END START
4.20试编程:从键盘输入同学的姓名Mr.ABC或Mrs.XYZ,当按动任意一个键时, 屏幕上将显示出
“Welcome Mr.ABC” 或“ Welcome Mrs.XYZ” 方法1,使用子程序
D SEGMENT
D1 DB "Please input name from the keyboard",0dh,0ah,"$"
D2 db 20,?,20 dup(?)
D3 DB "Welcome Mr. ABC",0DH,0AH,"$"
D4 DB "Welcome Mrs. XYZ",0DH,0AH,"$"
D5 DB "Please input again",0DH,0AH,"$"
D ENDS
S SEGMENT STACK
DB 200 DUP(?)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,ES:D
STAR:MOV AX,D
MOV DS,AX
CALL INPUT
CALL DISPLAY
MOV AH,4CH
INT 21H
INPUT PROC NEAR
LEA DX,D1
CALL DISPLAY
WW:LEA DX,D2
MOV AH,0AH
INT 21H
LEA DI,D2
CMP BYTE PTR[DI+1],6
JZ NEXT0
CMP BYTE PTR[DI+1],7
JZ NEXT1
LEA DX,D5
CALL DISPLAY
JMP WW
NEXT0:LEA DX,D3
JMP DONE
;CALL DISPLAY;去掉,否则显示两遍
NEXT1:LEA DX,D4
;CALL DISPLAY
DONE:RET
INPUT ENDP
DISPLAY PROC NEAR
MOV AH,09H
INT 21H
RET
DISPLAY ENDP
C ENDS
END STAR 方法2
D SEGMENT
D1 DB "Mr. ABC"
N EQU $-D1
D2 DB "Mrs. XYZ"
N1 EQU $-D2
D3 DB "Welcome Mr. ABC",0DH,0AH,"$"
D4 DB "Welcome Mrs. XYZ",0DH,0AH,"$"
D5 DB 20 DB ?
DB 20 DUP⑺;好些同学N EQU $-D1,之后输入的实际字符数均和N 相比较,错在哪里
D ENDS
S SEGMENT STACK
DB 200 DUP(?)
S ENDS
C SEGMENT
ASSUME CS:C,DS:D,ES:D
STAR:MOV AX,D
MOV DS,AX
MOV ES,AX
LEA DX,D5
MOV AH,0AH
INT 21H ; 从键盘输入,输入缓冲区D5
LEA DI,D5 ; 输入字符长度和“ Mr. ABC”字符串长度比较
CMP BYTE PTR[DI+1],N
JNE LAST ; 不相等,转LAST
LEA DX,D3 ; 相等,输出"Welcome Mr. ABC"
MOV AH,9
INT 21H
LAST: LEA DI,D5;输入字符串长度和“ Mrs. XYZ”字符串长度比较
CMP BYTE PTR[DI+1],N1
JNE LAST1
LEA DX,D4 ; 相等,输出"Welcome Mrs. XYZ"
MOV AH,9
INT 21H
JMP LAST1
LAST1:MOV AH,4CH
INT 21H
C ENDS
END STAR
注意:第三章作业和第四章作业的要求区别:
第三章作业是编写程序段,不必按段结构写; 第四章作业是编写程序,必须按段结构写。