3.14 用重复前缀串比较指令比较两个字符串,一个是在数据段的字符串变量STR1(内容为'THIS IS A DOG'),另一个是在附加段的字符串变量STR2(内容为'THIS IS A COCK')。当比较到第一个不相同的字符时停止比较,把相同部分字符串长度存入数据段的字节变量NUM中。写出分段结构的程序段,应包括段定义,伪指令和指令序列。问:相同部分字符串长度为多少?在STR1和STR2第一个不同处的偏移地址是多少?
DATA SEGMENT
STR1 DB 'THIS IS A DOG' LEN1 DB $-STR1 NUM DB ? DATA ENDS EDATA SEGMENT
STR2 DB 'THIS IS A COCK' LEN2 DB $-STR2 EDATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:EDATA START: MOV AX,DATA MOV DS,AX MOV AX,EDATA MOV ES,AX
CLD ;串操作由低地址向高地址 MOV CH,0 MOV AL,LEN1 CMP AL,ES:LEN2 JB B1L2
MOV CL,ES:LEN2 JMP CMPOK B1L2: MOV CL,AL CMPOK: LEA SI,STR1 LEA DI,ES:STR2 REPE CMPSB MOV AX,SI
DEC AL ;不同处的字节偏移地址
MOV NUM,AL ;不同处的字节偏移地址放到NUM MOV AH, 4CH INT 21H CODE ENDS
END START
答:相同长度10,不同处的偏移地址10
3.15 有两个压缩型BCD码相加,被加数(6756)和加数(7321)存放在数据段的BUFFER变量的4个连续的字节存储单元中,结果(和)存放在RESUT变量的三个字单元中(考虑到有进位的情况),编制具有数据段和代码段结构的完整程序,程序中需要作必要的注释。 注:结果存放在RESUT字节变量中,三个字单元不知要求怎么用 DATA SEGMENT
BUFFER DB 67H,56H,73H,21H RESUT DB 3 DUP (?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX
MOV AL,BUFFER+1 ;第一个数据低两位->AL MOV BL,BUFFER+3 ;第二个数据低两位->BL ADD AL,BL ;低两位相加 DAA ;十进制调整
MOV DL,AL ;低两位相加结果放到DL MOV AL,BUFFER ;第一个数据高两位->AL MOV BL,BUFFER+2 ;第二个数据高两位->BL ADC AL,BL ;低两位相加 DAA ;十进制调整 MOV BL,0 JNC HCF INC BL
HCF: MOV RESUT,BL ;存放最高位 MOV RESUT+1,AL ;存放中间两位 MOV RESUT+2,DL ;存放最低两位 MOV AH, 4CH INT 21H CODE ENDS
END START
3.16 将SRCBUF变量定义的80个字符串传送到DSTBUF变量定义的存储区去。当遇到0DH时,不将此字符传送到DSTBUF变量中去。试编写程序,并加以注释。 DATA SEGMENT
SRCBUF DB 'aaa',0DH,'bbb' DSTBUF DB 80 DUP (?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV CX,07 ;比较次数->CX MOV SI,0 ;源串指针->SI MOV DI,0 ;目标串指针->DI SDCMP: MOV AL,SRCBUF[SI] CMP AL,0DH JZ NSEND
MOV DSTBUF[DI],AL ;不等于0DH,保存数据,修改SI、DI INC DI
NSEND: INC SI ;等于0DH,不保存数据,修改SI LOOP SDCMP MOV AH, 4CH INT 21H CODE ENDS
END START
3.17 已知有n个元素存放在以BUF为首址的字节存储区中,试统计其中负元素的个数,画出程序框图,编写程序。
DATA SEGMENT
BUF DB 92H,12H,0F3H,23H,87H LEN EQU $-BUF DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV CX,LEN ;比较次数->CX MOV SI,0 ;字节存储区指针 MOV DL,0 ;负元素个数初始化 NEGCMP: MOV AL,BUF[SI] CMP AL,0 JNL C0GE
INC DL ;小于0,个数加1,指针加1 C0GE: INC SI ;不小于0,指针加1 LOOP NEGCMP MOV AH, 4CH INT 21H CODE ENDS
END START
3.18 已知以BUF为首址的字存储区中存放着n个有符号的二进制数,试编写程序,将大于等于0的数送以BUF1为首址的字存储区中,将小于0的数送以BUF2为首址的字存储区中,并画出程序框图。 DATA SEGMENT
BUF DW 1212H,0FF12H,3434H,8989H,5656H,9090H LEN EQU ($ - BUF) / 2 BUF1 DW LEN DUP (?) BUF2 DW LEN DUP (?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV CX,LEN ;循环次数,即BUF的单元数 MOV BX,0 ;BUF指针初始化 MOV SI,0 ;BUF1指针初始化 MOV DI,0 ;BUF2指针初始化 CLOOP: MOV AX,[BX] ;BUF数据->AX CMP AX,0 JGE TO1
MOV BUF2[DI],AX ;AX<0,AX->BUF2,DI+2->DI,BX+2->BX INC DI INC DI
JMP CONTINUE
TO1: MOV BUF1[SI],AX ;AX>=0,AX->BUF1,SI+2->SI,BX+2->BX INC SI INC SI CONTINUE:INC BX INC BX LOOP CLOOP MOV AH, 4CH INT 21H CODE ENDS
END START
3.19 已知在以BUF为首地址的字节存储区中,存放着一个以′$′作结束标志的字符串,试编写程序,在CRT上显示该字符串,并要求将小写字母以大写字母形式显示出来。画出程序框图。 DATA SEGMENT
BUF DB 'abCDalskdjf$' DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV SI,0 ;BUF地址指针 ALOOP: MOV DL,BUF[SI] ;BUF数据->DL CMP DL,'$' ;DL='$',EXIT JE STOP CMP DL,5AH
JBE UPPER ;大写字母,打印输出,地址指针SI加1
SUB DL,20H ;小写字母,DL减20H后打印输出,地址指针SI加1 UPPER: MOV AH,02H INT 21H INC SI
JMP ALOOP STOP: MOV AH, 4CH INT 21H CODE ENDS
END START
3.20 设有三个字节变量X、Y、Z,试找出X、Y有符号数中较大者送入Z中,编写程序。 推荐检测实例:-128和127 DATA SEGMENT X DB 0F0H Y DB 12H Z DB ? DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV AL,X ;X->AL CMP AL,Y ;X ? Y JGE NEXT ;X>=Y,X->Z MOV AL,Y ;X
END START
3.21 设在变量单元A、B和C中存放有三个数,若三个数都不为0,则求出三个数之和存入D中;若有一个为0,则将其他两个单元也清零,编写程序。 DATA SEGMENT
A DB 0F0H B DB 12H C DB 22H