5-1
DSEG SEGMENT
A DB 5
B DB -6
C DB 30
DSEG ENDS
CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
MOV AL,A
MOV AH,0
IMUL B
MOV CX,AX
MOV DX,BX
MOV AL,C
MOV AH,0
CWD
ADD AX,CX
ADC DX,BX
SUB AX,70
SBB BX,0
IDIV A
MOV [1000H],AX
MOV [1001H],DX
MOV AH,4CH
INT 21H
CSEG ENDS
END START
5-2
DSEG SEGMENT
RESULT 5 DUP(?)
DSEG ENDS
CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
MOV DX,0000H
MOV AX,65535
MOV CX,10000
DIV CX
MOV RESULT,AL
MOV AX,DX
MOV DX,0000H
MOV CX,1000
DIV CX
MOV RESULT+1,AL
MOV AX,DX
MOV DX,0000H
MOV CX,100
DIV CX
MOV RESULT+2,AL
MOV AX,DX
MOV DX,0000H
MOV CX,10
DIV CX
MOV RESULT+3,AL
MOV RESULT+4,DL
MOV AH,4CH
INT 21H
CSEG ENDS
END START
6
DSEG SEGMENT
DATA DW 0201H,0403H,0605H,0807H,0A09H,0C0BH,2323H,7788H,3456H, 1234H
NUM DW 10
DISP DW 18
SOUR DW 4010H
DEST DW 4000H
DSEG ENDS
CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
MOV CX,NUM
LEA SI,DATA
MOV DI,SOUR
CLD
REP MOVSW
MOV CX,NUM
MOV SI,SOUR
MOV DI,DEST
CMP SI,DI
JA NEXT ;SI>DI跳
STD
ADD SI,DISP
ADD DI,DISP
NEXT: REP MOVSW
MOV AH,4CH
INT 21H
CSEG ENDS
END START
7-1
DSEG SEGMENT
DATA DW 0210H,0403H,0605H,0807H,0A09H,0C0BH,0E0DH,1234H,5678H,1122H
NUM DW 10
DISP DW 18
SOUR DW 4000H
DEST DW 4010H
DSEG ENDS
CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
MOV CX,NUM
LEA SI,DATA
MOV DI,SOUR
CLD
REP MOVSW
MOV CX,NUM
MOV SI,SOUR
MOV DI,DEST
CMP SI,DI
JA NEXT
ADD SI,DISP
ADD DI,DISP
JMP NEXT2
NEXT: MOV BX,[SI]
MOV [DI],BX
INC SI
INC SI
INC DI
INC DI
LOOP NEXT
JMP END1
NEXT2: MOV BX,[SI]
MOV [DI],BX
DEC SI
DEC SI
DEC DI
DEC DI
LOOP NEXT2
END1: MOV AH,4CH
INT 21H
CSEG ENDS
END START
7-2
DSEG SEGMENT
DATA DW 34,56,78
NUM DW 3
DISP DW 8
SOUR DW 4010H
DEST DW 4020H
DSEG ENDS
CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
MOV CX,NUM
LEA SI,DATA
MOV DI,SOUR
CLD
REP MOVSW
MOV CX,NUM
MOV SI,SOUR
MOV DI,DEST
LOOP1: MOV AL,10
MOV BX,[SI]
MUL BH
ADD BL,AL
MOV [DI],BL
INC SI
INC SI
INC DI
INC DI
LOOP LOOP1
MOV AH,4CH
INT 21H
CSEG ENDS
END START
8
DATA SEGMENT
ARRAY DB 55,78H,43,19,0,1,10,80H,0FFH,100
NUM DW 10
DEST DW 1000H
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,0
MOV CX,NUM
MOV SI,OFFSET ARRAY
MOV DI,DEST
CLD
REP MOVSW
CALL FIND_MIN_MAX
MOV AL,BH
ADD AL,BL
INTO
ADC AH,0
SAL AX,1
MOV AH,4CH
INT 21H
FIND_MIN_MAX PROC
PUSH AX
PUSH CX
PUSH SI
MOV CX,NUM
MOV SI,DEST
MOV BH,[SI]
MOV BL,[SI]
FIND_LOOP:
MOV AL,[SI]
CMP AL,BH
JBE CMP_MIN
MOV BH,AL
CMP_MIN:
CMP AL,BL
JAE NEXT_ELEMENT
MOV BL,AL
NEXT_ELEMENT:
INC SI
LOOP FIND_LOOP
POP SI
POP CX
POP AX
RET
FIND_MIN_MAX ENDP
CODE ENDS
END START
9-1
DATA SEGMENT
NUM DB 3FH ;定义一个字节数据变量NUM
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX ;数据段地址放入寄存器DS
MOV AL, NUM ;将NUM中的数复制到AL中
SHR AL, 4 ;右移4位,得到高4位
CALL TO_ASCII ;调用子程序,将AL中数转换为ASCII码
MOV AH, 09H ;功能号
MOV BH, 0H ;设置页号
MOV BL, 0EH ;设置颜色属性(黄色前景,黑色背景)
MOV CX, 1 ;设置重复次数
INT 10H ;调用BIOS中断,打印彩色字符
MOV AL, NUM
AND AL, 0FH ;与0FH,得到低4位
CALL TO_ASCII ;调用子程序,将NUM转换为ASCII码
MOV AH, 02H
MOV DH, 0H ;设置行号
MOV DL, 1H ;设置列号
INT 10H ;调用BIOS中断,设置光标位置
MOV AH, 09H
INT 10H ;调用BIOS中断,打印彩色字符
MOV AH, 4CH ;返回DOS
INT 21H
TO_ASCII PROC ;定义子程序
CMP AL, 9 ;比较是否小于等于9
JBE LESS_NINE ;如果是,则跳转
ADD AL, 7 ;如果不是,则加7,得到A~F对应的ASCII码
LESS_NINE: ADD AL, 30H ;加30H,得到0~9对应的ASCII码
RET ;返回主程序
TO_ASCII ENDP ;结束子程序
CODE ENDS ;结束代码段
END START ;结束程序
9-2
DATA SEGMENT
ERR DB 'ERROR!$' ;定义一个错误提示信息
DATA ENDS
STACK SEGMENT
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START:
MOV AX, DATA ;初始化数据段寄存器
MOV DS, AX
MOV DX, 0100H
MOV AH, 02H
INT 10H ;将光标位置设置在1行0列
NEXT: MOV AH, 08H ;设置DOS功能调用参数
INT 21H ;调用DOS中断,从键盘输入一个字符到AL中
CMP AL, '#' ;比较是否输入了'#'号
JE FINISH ;如果是,跳转到结束
CMP AL, 'A' ;比较是否输入了大写字母
JB ERROR ;如果小于'A',跳转到ERROR标签处
CMP AL, 'Z' ;比较是否输入了大写字母
JA ERROR ;如果大于'Z',跳转到ERROR标签处
CMP BL, 0CEH ;如果上一个输入错误字符则BL=0CEH
JNE PRINT ;没有错误提示不用清除
CALL CLEAN ;否则调用子程序清除错误提示
PRINT: ADD AL, 20H ;将大写字母转换为小写字母
MOV DL, AL
MOV AH, 02H ;设置DOS功能调用参数
INT 21H ;调用DOS中断,将AL中的字符输出到屏幕上
JMP NEXT ;跳转到NEXT标签处,继续输入下一个字符
ERROR:
CMP BL, 0CEH ;如果重复出错,不重复提示
JE NEXT
MOV AH, 03H
INT 10H ;获取当前光标位置
PUSH DX ;保护当前光标位置
MOV DX, 0H
MOV AH, 02H
INT 10H ;光标定位到0行0列
MOV AH, 9H ;设置DOS功能调用参数
MOV CX, 6H
MOV BL, 0CEH
INT 10H
MOV DX, OFFSET ERR ;将错误提示信息的偏移地址存入DX寄存器
INT 21H ;调用DOS中断,将DX指向的字符串输出到屏幕上
POP DX
MOV AH, 02H
INT 10H ;还原光标位置
JMP NEXT ;跳转到NEXT标签处,继续输入下一个字符
CLEAN PROC
MOV AH, 03H
INT 10H ;获取当前光标位置
PUSH DX ;保护当前光标位置
MOV DX, 0H
MOV AH, 02H
INT 10H ;光标定位到0行0列
MOV BL, 0H
MOV AH, 9H
MOV CX, 6H
INT 10H ;清除ERROR
POP DX
MOV AH, 02H
INT 10H
MOV AH, 02H ;还原光标位置
RET ;退出子程序
CLEAN ENDP
FINISH: MOV AH, 4CH ;返回DOS
INT 21H
CODE ENDS ;结束代码段
END START ;结束程序