解:STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS DATA SEGMENT
MEM1 DW 7890H,5678H MEM2 DW 1234H,4786H SUM DW 2 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX LEA SI,MEM1 LEA DI,MEM2 LEA BX,SUM MOV AX,[SI] ADD AX,[DI] MOV [BX],AX INC SI INC SI INC DI
INC DI INC BX INC BX
MOV AX,[SI] ADC AX,[DI] MOV [BX],AX
MOV AH,4CH INT 21H
CODE ENDS END START
设计的两个数分别是:56787890,47861234。运行结果显示知:SUM单元07188--0718B存入了最后结果,可得:56787890+47861234=9DFE8AC4。
2、试编写程序,比较AX,BX,CX中带符号数的大小,并将最大的数放在AX中。
解:STACK SEGMENT STACK
DW 64 DUP(?) STACK ENDS DATA SEGMENT
MEM DW 1234H,5611H,1221H CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA
MOV DS,AX
LEA DI,MEM ;取出3个数
MOV AX,[DI]
MOV BX,[DI+02H] MOV CX,[DI+04H] CMP AX,BX JLE A1
CMP AX,CX JLE A3
MOV AX,AX JMP A5
A1: CMP BX,CX
JLE A3
MOV AX,BX JMP A5
A3: MOV AX,CX
JMP A5
A5: HLT ;程序运行到此暂停,查看AX的值可知结果,接下来的命 MOV AH,4CH ;令需用AH,故,如果程序运行完再查看AX,则看不到结果。 INT 21H CODE ENDS END START
存入的三个数:1234H,5611H,1221H.运行后的最大的数的结果在AX显示为:5611H。
3、请用子程序结构编写如下程序:从键盘输入一个二位十进制的月份数(01~12),然后显示出相应的英文缩写名。 解:STACK SEGMENT DW 64 DUP(?)
STACK ENDS
DATA SEGMENT
BUFF1 DB 'PLEASE WRITE YOUR NUMBER:','$' ;输入界面 BUFF2 DB 'THE MONTH IS:','$' ;输出界面 BUFF3 DB 3 ;缓存地址 DB ?
DB 3 DUP (?) BUFF4
'JAN$','FEB$','MAR$','APR$','MAY$','JUN$','JNL$','AUG$','SEPT$' ,'OCT$','NOV$','DEC$'
BUFF5 DB 'WRONG INPUT!$' ;错误输入提示 DB
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV DX,OFFSET BUFF1 MOV AH,09H INT 21H
XOR DX,DX
LEA DX,BUFF3 MOV AH,0AH INT 21H
MOV DL,0DH MOV AH,2H INT 21H
MOV DL,0AH MOV AH,2H INT 21H
MOV DX,OFFSET BUFF2 MOV AH,09H INT 21H
XOR AX,AX XOR BX,BX MOV AL,0AH
MOV DI,OFFSET BUFF3 MOV BH,[DI+02H] MOV BL,[DI+03H] SUB BH,30H MUL BH AND BX,0FH ADD BX,AX DEC BX XOR AX,AX MOV AL,04H
MUL BL XOR BX,BX
;显示第一行 ;输入月份(01—12) ;回车换行 ;显示第二行 ;主程序开始
LEA DI,BUFF4 MOV BX,DI ADD BX,AX
CMP AL,30H ;判断输入月份是否超出12月,超 JA A2 ;出则输出错误提示 JMP A4
A2: MOV DX,OFFSET BUFF5 MOV AH,09H INT 21H JMP A5 A4: CMP AL,20H ;判断输入月份否大于等于9月 JA A1 JMP A3 A1: INC BX JMP A3
A3: MOV DX,BX ;显示(01-12月份)的结果 MOV AH,09H INT 21H
A5: MOV AH,4CH INT 21H CODE ENDS END START
在输入界面上输入02,则显示:
若输入错误月份则显示:
4、编写一程序段,把从BUFFER开始的100个字节的内存区域初始化成55H、0AAH、55H、0AAH、…、55H、0AAH。 解:STACK SEGMENT DW 64 DUP(?) STACK ENDS
DATA SEGMENT BUFF DB 100 DUP(?) DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX XOR CX,CX MOV CX,32H
MOV DI,OFFSET BUFF A1:
MOV [DI],55H
MOV [DI+01H],0AAH INC DI INC DI DEC CX JNE A1
A2:XOR AX,AX MOV AH,4CH INT 21H CODE ENDS END START
运行上面程序,则可以看到存数器内地址07180—071E3共100个位置依次初始化为55H,0AAH,55H,0AAH....
5、试编写程序,从键盘中读入20个无符号十进制整数(<65535),并升序排序后输出。
解:STACK SEGMENT DW 128 DUP(?) STACK ENDS DATA SEGMENT
ARR DW 50 DUP(?) ;存放输入的数 STR DW 50 DUP(?) ;输出字符串
COUNT DW ? ;输入数的个数 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV AX,STACK MOV SS,AX
LEA SI,ARR
MOV DI,0 ;DI用来标志是否输入了回车
L1: CALL DCB ;将输入的十进制数化为二进制存在BX INC COUNT MOV [SI],BX
CMP DI,0 ;有回车是,输入结束 JNZ L2 ADD SI,2
JMP L1
L2: CALL BBB ;回车换行
SUB COUNT,1 ;将输入个数减1 CALL SORTP ;采用冒泡排序法
ADD COUNT,1 ;输入个数加1,即为原输入个数 MOV CX,COUNT LEA DI,ARR
LEA SI,STR L3: MOV AX,[DI]
CALL BCD ;将AX中的进制数化为十进制依次存在[SI]
ADD DI,2 LOOP L3
DEC SI ;去掉最后一个\号 MOV [SI], BYTE PTR 0DH MOV [SI+1], BYTE PTR 0AH MOV [SI+2], BYTE PTR '$' LEA DX,STR MOV AH,9 INT 21H MOV AH,4CH INT 21H
BBB PROC ;子程序BBB PUSH AX PUSH DX MOV DL,0DH MOV AH,2 INT 21H
MOV DL,0AH MOV AH,2 INT 21H POP DX POP AX RET
BBB ENDP
DCB PROC ;子程序DCB PUSH AX PUSH CX MOV BX,0
NEW: MOV AH,1
INT 21H
CMP AL,',' ;如果是分号,则输入一个十进制数结束 JZ NDIG
CMP AL,0DH ;如果是回车,则置DI为1输入结束 JNZ NHC MOV DI,1 NDIG: POP CX POP AX RET
NHC: CMP AL,30H JL NDIG CMP AL,39H JG NDIG AND AL,0FH CBW
XCHG AX,BX MOV CX,10 MUL CX
XCHG AX,BX ADD BX,AX JMP NEW DCB ENDP
BCD PROC ;子程序BCD PUSH AX PUSH BX PUSH CX PUSH DX MOV BX,10 MOV CX,0 R1: MOV DX,0 DIV BX PUSH DX INC CX OR AX,AX JNZ R1 R2: POP AX CMP AL,10 JB R3
ADD AL,7H R3: ADD AL,30H MOV [SI],AL INC SI LOOP R2
MOV [SI],BYTE PTR ',' ;每个数后放一个','号 INC SI POP DX POP CX
POP BX POP AX RET BCD ENDP
SORTP PROC ;子程序SORTP PUSH AX
PUSH BX PUSH CX PUSH DI PUSH SI
MOV DI,OFFSET ARR MOV BX,-1 ;设标志-1 LOOPOUT:CMP BX,-1
JNE SORTEND ;标志不为-1,则排序完成 XOR BX,BX ;0->BX MOV CX,COUNT MOV SI,DI
LOOPIN: MOV AX,[SI]
CMP AX,[SI+2] ;两两比较
JLE NOCHANGE ;如果<=则不交换 XCHG [SI+2],AX ;否则交换 MOV [SI],AX
MOV BX,-1 ;置BX为-1,标示有交换 NOCHANGE:ADD SI,2
LOOP LOOPIN ;判断本次排序是否完成 JMP LOOPOUT SORTEND:POP SI POP DI POP CX POP BX POP AX RET
SORTP ENDP CODE ENDS END START
运行程序,输入一组数据,回车运行后显示出一组由小到大的数据:
6、设100位同学的某一门课的百分制分数存放于始于2000H:0100H的地方,请编写程序,把分数换算成5分制,存放于起始为3000H:0100H的地方 解:
STACK SEGMENT DW 64 DUP(?) STACK ENDS
CODE SEGMENT
ASSUME CS:CODE START: MOV AX,2000H MOV DS,AX XOR CX,CX
MOV CX,0AH ;设定多少个同学的成绩需要转换 MOV AX,0100H MOV DI,AX MOV BX,3000H MOV ES,BX A6:
XOR AX,AX
MOV AL,[DI] ;拿出第一个数
CMP AX,3CH ;比较60分 JAE A1
MOV ES:[DI],0EH INC DI DEC CX JNE A6 JMP A7
A1:CMP AX,46H ;比较70分 JAE A2
MOV ES:[DI],0DH INC DI DEC CX JNE A6 JMP A7
A2:CMP AX,50H ;比较80分 JAE A3
MOV ES:[DI],0CH INC DI DEC CX JNE A6 JMP A7
A3:CMP AX,5AH ;比较90分 JAE A4
MOV ES:[DI],0BH INC DI DEC CX JNE A6 JMP A7
A4:MOV ES:[DI],0AH INC DI
DEC CX JNE A6 JMP A7 A7:
MOV AH,4CH INT 21H
CODE ENDS END START
存入100位同学的成绩,成绩都是则输出五分制的成绩是:0A,0B,0C,0D,0E,
如图所示:假设存入10位同学的成绩,分别存放始于在(2000H:0100H):63H,58H,4DH,42H,37H,2CH,21H,16H,0BH,00H,即对应的十进制数是:99,88,77,66,55,44,33,22,11,00分
运行程序之后显示五分制结果,可以从(3000H:0100H)开始查看,分别是:
0A,0B,0C,0D,0E,0E,0E,0E,0E,0E
因篇幅问题不能全部显示,请点此查看更多更全内容