计算机接口技术与微分原理
例4.8求10个无符号字节数的和
DATA SEGMENT
;此处输入数据段代码
TABLE DB 12H,23H,34H,45H,56H
DB67H,78H,89H,9AH,0FDH
SUM DW ?
DATA ENDS
;
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,ES:DATA
START:
;此处输入代码段代码
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEASI,TABLE
MOV CX,10
XOR AX,AX
NEXT:ADD AL,[SI]
ADC AH,0
INC SI
LOOP NEXT
MOV SUM,AX
HLT
CODE ENDS
END START
例4.9判断是否有F8按下,若有则转NEXT
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,0
CMP AL,0
JNZ ERROR
CMP AH,42H
JE NEXT
NEXT:
ERROR:
CODES ENDS
END START
例4.10将光标置于0显示页(20,30)位置,并以正常属性打印‘$’
DATAS SEGMENT
;此处输入数据段代码
DATAS END
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOV DS,AX
;此处输入代码段代码
MOV AH,2
MOV BH,0
MOV DH,20
MOV DL,30
INT 10H
MOV AH,9
MOV BH,0
MOV BL,7
MOV AL,'$'
MOV CX,1
INT 10H
CODES ENDS
END START
例4.11从键盘输入Y或N字符
DATAS SEGMENT
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUMECS:CODES,DS:DATAS,SS:STACKS
START:
MOVAX,DATAS
MOV DS,AX
;此处输入代码段代码
KEY:MOVAH,1
INT 21H
CMP AL,'Y'
JE YES
CMP AL,'N'
JE DAT
JMP KEY
YES:
DAT:
CODES ENDS
END START
例4.12从键盘上输入字符串‘hello’,并在串尾加标识符$
DATA SEGMENT
;此处输入数据段代码
STRING DB10,0,10 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
LEADX,STRING
MOV AH,0AH
INT 21H
MOVCL,STRING+1
XOR CH,CH
ADD DX,CX
MOV BX,DX
MOV BYTEPTR[BX+2],'$'
MOV AH,4CH
INT 21H
CODE ENDS
END START
结果:
例4.13在屏幕上一次显示1,2,3,A ,B ,C
DATA SEGMENT
;此处输入数据段代码
STR1 DB '123ABC'
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
LEA BX,STR1
MOV CX,6
LPP:MOV AH,2
MOV DL,[BX]
INC BX
INT 21H
LOOP LPP
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4.14在屏幕上显示‘HELLO WORLD!’
DSEG SEGMENT
;此处输入数据段代码
STRING DB'HELLO WORLD!',0DH,0AH,'$'
DSEG ENDS
CSEG SEGMENT
ASSUMECS:CSEG,DS:DSEG
START:
MOV AX,DSEG
MOV DS,AX
;此处输入代码段代码
LEADX,STRING
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END START
例4.15从键盘上输入一个字符串,在字符串尾插入$,并显示该字符串
DATA SEGMENT
;此处输入数据段代码
BUFSIZE DB50
ACTLEN DB ?
CHARS DB 50DUP(20H)
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOV DX,OFFSET BUFSIZE
MOV AH,0AH
INT 21H
XOR CX,CX
MOVCL,ACTLEN
MOV DX,OFFSET CHARS
MOV BX,DX
ADD BX,CX
MOV BYTEPTR[BX],'$'
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4.16编写S=86H*34*-21H的程式,式中的三个数均为无符号数
DATA SEGMENT
;此处输入数据段代码
NUM DB86H,34H,21H
RESULT DW ?
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
LEA SI,NUM
LEADI,RESULT
MOV AL,[SI]
MOVBL,[SI+1]
MUL BL
MOVBL,[SI+2]
MOV BH,0
SUB AX,BX
MOV [DI],AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4.17内存自TABLE开始的连续16个单元中存放着0-15的平方值,查表求DATA中任意数X(0-15)的平方值,并将结果放到RESULT。
DSEG SEGMENT
;此处输入数据段代码
TABLE DB0,1,4,9,16,25,36,49,64,81,100,121,144,169,225
DATA DB ?
RESULT DB ?
DSEG ENDS
;
SSEG SEGMENT STACK'STACK'
DB 100 DUP(?)
SSEG ENDS
;
CSEG SEGMENT
ASSUMECS:CSEG,DS:DSEG,SS:SSEG
START:
MOV AX,DSEG
MOV DS,AX
;此处输入代码段代码
MOV AX,DSEG
MOV SS,AX
LEABX,TABLE
MOV AH,0
MOV AL,DATA
ADD BX,AX
MOV AL,[BX]
MOVRESULT,AL
MOV AH,4CH
INT 21H
CSEG ENDS
END START
例4.18编写程序,将数据区中以BUFFER为首地址的100个字节单元清零。
DATA SEGMENT
;此处输入数据段代码
BUFFER DB100 DUP(?)
COUNT DW100
DATA ENDS
STACK SEGMENT
;此处输入堆栈段代码
DW 32 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOVAX,STACK
MOV SS,AX
MOVCS,COUNT
LEABX,BUFFER
ADD CX,BX
AGAIN:MOV BYTE PTR[BX],0
INC BX
CMP BX,CX
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4.19在当前数据段中DATA1开始的顺序80个单元中,存放着80位同学某功课的考试成绩。编写程序统计》=90分,70-79分,60-69分,60-69分以及<60分的人数,并将结果放到同一数据段中DATA2开始的五个单元中.
DATA SEGMENT
;此处输入数据段代码
DATA1 DB80 DUP(?)
DATA2 DB 5DUP(0)
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOV CX,80
LEASI,DATA1
LEADI,DATA2
AGAIN:MOV AL,[SI]
CMP AL,90
JC NEXT1
INC BYTEPTR[DI]
JMP STO
NEXT1:
CMP AL,80
JC NEXT2
INC BYTEPTR[DI+1]
JMP STO
NEXT2:
CMP AL,70
JC NEXT3
INC BYTEPTR[DI+2]
JMP STO
NEXT3:
CMP AL,60
JC NEXT4
INC BYTEPTR[DI+3]
JMP STO
NEXT4:INC BYTE PTR[DI+4]
STO:INC SI
LOOP AGAIN
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4.20把从MEM单元开始的100个16位无符号数从大到小的顺序排列。
DSEG SEGMENT
;此处输入数据段代码
MEM DW 100 DUP(?)
DSEG ENDS
;
CSEG SEGMENT
ASSUMECS:CSEG,DS:DSEG
START:
MOV AX,DSEG
MOV DS,AX
;此处输入代码段代码
LEA DI,MEM
MOV BL,99
NEXT1:
MOV SI,DI
MOV CL,BL
NEXT2:
MOVAX,[SI]
ADD SI,2
CMPAX,[SI]
JNC NEXT3
MOV[SI-2],DX
MOV[SI],AX
NEXT3:
DEC CL
JNZ NEXT1
DEC BL
JNZ NEXT2
MOV AH,4CH
INT 21H
CSEG ENDS
END START
例4.21从一个字符串中删去一个字符
DATA SEGMENT
;此处输入数据段代码
STRING DB 'EXPERIENCE...'
LENG DW $-STRING
KEY DB'X'
DATA ENDS
;
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,ES:DATA
START:
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOV ES,AX
LEABX,STRING
LEA CX,LENG
PUSH BX
PUSH CX
MOV AL,KEY
CALL DELCHAR
MOV AH,4CH
INT 21H
MAIN ENDP
DELCHAR PROC
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI
CLD
MOVSI,[BP+4]
MOVCX,[SI]
MOVDI,[BP+6]
REPNE SCASB
JNE DONE
MOVSI,[BP+4]
DEC WORDPTR[SI]
MOV SI,DI
DEC DI
REP MOVSB
DONE:POP DI
POP SI
POP BP
RET
DELCHAR ENDP
CODE ENDS
END STRAT
例4.22设一个字符串长度不超过255个字符,是确定该字符串的长度并显示长度值。
DATA SEGMENT
;此处输入数据段代码
STRING DB'THIS IS A STRING...',0DH
LENG DW ?
CRR DB 13
MESSAGE DB 'THE STRING IS TOO LONG',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,ES:DATA
START:
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
CALL STRLEN
MOV DX,LENG
CMP DX,100H
JB NEXT1
LEADX,MESSAGE
MOV AH,9
INT 21H
JMP NEXT2
NEXT1:
MOV DH,DL
MOV CL,4
SHR DL,CL
CMP DL,9
JBE LP
ADD DL,7
LP:
ADDDL,30H
MOV AH,2
INT 21H
MOV DL,DH
MOVDL,0FH
CMP DL,9
JBE LP1
ADD DL,7
LP1:
ADDDL,30H
MOV AH,2
INT 21H
MOV DL,'H'
MOV AH,2
INT 21H
NEXT2:
MOVAH,4CH
INT 21H
MAIN ENDP
STRLEN PROC
LEADI,STRING
MOVCX,0FFFFH
MOVAL,CRR
MOV AH,'$'
CLD
AGAIN:
INC CX
CMPCX,100H
JAE DONE
SCASB
JNE AGAIN
DONE:
MOVLENG,CX
RET
STRLEN ENDP
CODE ENDS
END START
例4.23把用ASCII表示的数转换为二进制,ASCII存放在仪MASC为首地址的内存单元中,转换结果放在MBIN.
DATA SEGMENT
;此处输入数据段代码
MASC DB '2','6','A','1'
MBIN DB 2 DUP(?)
DATA ENDS
;
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOV CL,4
MOV CH,CL
LEA SI,MASC
CLD
XOR AX,AX
XOR DX,DX
NEXT1:LODSB
ANDAL,7FH
CMP AL,'0'
JB ERROR
CMP AL,'9'
JA NEXT2
SUBAL,30H
JMP SHORT NEXT3
NEXT2:
CMP AL,'A'
JB ERROR
CMP AL,'F'
JA ERROR
SUBAL,37H
NEXT3:
OR DL,AL
ROR DX,CL
ERROR:
DEC CH
JNZ NEXT1
MOV WORDPTR MBIN,DX
MOVAH,4CH
INT 21H
CODE ENDS
END START
例4.24把存放在BUFF中的16位二进制数转换为ASCII码表示的等值数字符串。
DATA SEGMENT
;此处输入数据段代码
BUFF DW 4FB6H
ASCC DB 5 DUP(?)
DATA ENDS
;
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOV CX,5
LEA DI,ASCC
XOR DX,DX
MOV AX,BUFF
MOV BX,0AH
AGAIN:
DIV BX
ADDDL,30H
MOV[DI],DL
INC DI
AND AX,AX
JZ STO
MOV DL,0
LOOP AGAIN
STO:
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4.25两个多字节二进制数求和程序
DATA SEGMENT
;此处输入数据段代码
BUFF1 DB 4FH,0B6H,7CH,34H,56H,1FH
BUFF2 DB 13H,24H,57H,68H,0FDH,9AH
SUM DB 6 DUP(?)
CONT DB 3
DATA ENDS
;
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOV SI,OFFSET BUFF1
MOV DI,OFFSET BUFF2
MOV BX,OFFSET SUM
XOR CX,CX
MOV CL,CONT
GOON:
MOVAX,[SI]
ADCAX,[DI]
PUSHF
ADD SI,2
ADD DI,2
MOV[BX],AX
POPF
LOOP GOON
ADC BYTEPTR[BX],0
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4.26从键盘上输入一个字符串,并在内存中已有的一张表中查找该字符串,如找到则在屏幕上显示OK,若找不到则显示NO,如输入长度大于表的长度则显示Wrong!
DATA SEGMENT
;此处输入数据段代码
TABLE DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
STRING1 DB 'PLEASE ENTERING A STRING:',0DH,0AH,'$'
STRING2 DB 'WRONG!',0DH,0AH,'$'
STRING3 DB 'OK!','$'
STRING4 DB 'NO!','$'
BUFFER DB40,?,40 DUP(?)
TAB_LEN EQU26
DATA ENDS
STACK SEGMENT
;此处输入堆栈段代码
STACK ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOV ES,AX
LEADX,STRING1
MOV AH,09H
INT 21H
LEADX,BUFFER
MOV AH,0AH
INT 21H
MOV SI,DX
INC SI
MOV BL,[SI]
MOV BH,0
INC SI
LEADI,TABLE
MOVCX,TAB_LEN
CMP CX,BX
JNC GOON
LEADX,STRING2
JMP EXIT
GOON:CLD
MOVAL,[SI]
SCAN:REPNZ SCASB
JZ MATCH
ERROR:LEA DX,STRING4
JMP EXIT
MATCH:INC CX
CMP CX,BX
JC ERROR
PUSH CX
PUSH SI
PUSH DI
MOV CX,BX
DEC DI
REPZ CMPSB
POP DI
POP SI
POP CX
JZ FOUND
JCXZ ERROR
FOUND:DEC DI
LEADX,STRING3
EXIT:MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
例4.27在分辨率640*480,16色的屏幕上绘制一个周期的正弦波
SETSCREEN MACRO
MOV AH,0
MOVAL,12H
INT 10H
ENDM
WRITEDOT MACRO
MOVAH,0CH
MOVAL,02H
MOVCX,ANGLE
ADDCX,140
MOVDX,TEMP
INT 10H
ENDM
DATA SEGMENT
;此处输入数据段代码
SINE DB 00,03,07,10,14,17,21,24,28,31,
35,38,42,45,48,52,55,58,62,65,
68,72,75,78,81,85,88,91,94,97,
100,103,106,109,112,115,118,120,
123,126,129,131,134,136,139,141
ANGLE DW 0
TEMP DW 0
DATA ENDS
STACK SEGMENT
;此处输入堆栈段代码
DB 64 DUP(?)
STACK ENDS
;
CODE SEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK
START:
MAIN PROC FAR
PUSH DS
PUSH AX
PUSH BX
MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOVAX,STACK
MOV SS,AX
SETSCREEN
AGAIN:
LEABX,SINE
MOVAX,ANGLE
CMPAX,180
JLE QUAD1
SUBAX,180
QUAD1:
CMP AX,90
JLE QUAD2
NEG AX
ADDAX,180
QUAD2:
ADD BX,AX
MOVAL,SINE[BX]
PUSH AX
MOV AH,0
CMPANGLE,180
JGE BIGDIS
NEG AL
ADDAL,240
JMP READY
BIGDIS:ADD AX,240
READY:
MOVTEMP,AX
POP AX
WRITEDOT
ADDANGLE,1
CMPANGLE,360
JLE AGAIN
MOV AH,07
INT 21H
MOV AH,0
MOV AL,3
INT 10H
POP BX
POP AX
POP DS
RET
MAIN ENDP
CODE ENDS
END START