[successbox title=”汇编程序编写和提高”][/successbox]
汇编第四次实验代码
1.编写一个汇编程序,实现字符串的复制功能,并且将复制的字符串显示出来。(选做部分:倒序显示复制字符串)
DATAS SEGMENT string_a db 'the school of information science and engineering shandong university','$' COUNT EQU $-string_a ;COUNT=$-OFFSET string_a ;相当于定义变量count,并把当前地址与string_a的地址之间的字节数赋给count ;当前的偏移地址$减去string_a的偏移地址,得到(数组)string_a的个数。 DATAS ENDS STACKS SEGMENT string_b db 100 dup(?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AX, STACKS MOV ES,AX LEA SI,string_a ;实际执行时将string_a的地址放入SI LEA DI,string_b ;实际执行时将string_b的地址放入DI MOV CX,COUNT ;把string_a的字节数给到cx.下面rep指令直到cx=0才停止. CLD ;DF=0.SI,DI的地址指针自动增加 REP MOVSB ;可以等价于: ;s: movsb;将ds:[si]为首地址所指的字符串移动到es:[di]为首地址所指的空间中 ;loop s LEA DX,string_b ;将string_b地址送到DX MOV AH,9H INT 21H ;显示DS:DX地址处的字符串 MOV AH,4CH INT 21H CODES ENDS END START
2.利用中断调用,在屏幕上显示 1—9 之间随机数。中断号86H
DATAS SEGMENT TIP DB 0DH,0AH,'RANDOM NUMBER:','$' ;提示显示随机数 DATAS ENDS STACKS SEGMENT STACK DB 200 DUP(0) STACKS ENDS CODES SEGMENT ASSUME DS:DATAS,SS:STACKS,CS:CODES MAKERAND PROC ;定义子程序 PUSH CX PUSH DX ;CX,DX入栈 MOV AH,0 INT 1AH ;读时钟计数器值.CX:DX存着计数器值 MOV AX,DX MOV DX,0 MOV BX,10 DIV BX ;除以10获得1-9随机数 ADD DL,30H;余数转为ASCII码 MOV AH,02H INT 21H ;显示输出随机数 POP DX POP CX ;CX,DX出栈 IRET ;中断返回 MAKERAND ENDP ;子程序结束 START: MOV AX,DATAS MOV DS,AX LEA DX,TIP MOV AH,9 INT 21H ;输出提示字符串 MOV AX,0 MOV DS,AX ;段偏移地址指向0000 MOV BX,86H*4 ;把中断号86H的地址赋给BX CLI ;禁止中断发生 MOV WORD PTR DS:[BX],OFFSET MAKERAND ;进行字操作.将MAKERAND的偏移地址存入ES:BX MOV WORD PTR DS:[BX+2],SEG MAKERAND ;进行字操作.将MAEKRAND的段基地址存入ES:[BX+2] STI ;允许中断发生 INT 86H ;调用86,即MAKERAND子程序 MOV AH,4CH INT 21H ;程序结束 CODES ENDS END START
3.键盘输入 10 个学生的成绩,编写一个程序统计 60-69 分,70-79 分,80-89 分,90-99 分及 100 分的人数,分别存放在 Score6,Score7,Score8,Score9 和 Score10 单元中。 【输入 10 个学生的成绩如下】
65 98 78 82 88 95 72 62 90 100
DATAS SEGMENT TIP DB 0DH,0AH,'PLEASE INPUT SCORES:','$';提示输入 SCORE6 DB 0DH,0AH,'SCORE6:','$' ;提示输出成绩人数 SCORE7 DB 0DH,0AH,'SCORE7:','$' SCORE8 DB 0DH,0AH,'SCORE8:','$' SCORE9 DB 0DH,0AH,'SCORE9:','$' SCORE10 DB 0DH,0AH,'SCORE10:','$' SCOREOUT DB 0DH,0AH,'OUTSCORE:','$' SSCORE6 DB 30H SSCORE7 DB 30H SSCORE8 DB 30H SSCORE9 DB 30H SSCORE10 DB 30H OUTSCORE DB 30H DATAS ENDS STACKS SEGMENT DB 200 DUP(0) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AH,9 LEA DX,TIP INT 21H ;显示提示输入字符串 MOV CX,10 ;设置循环次数 S: MOV AH,1 INT 21H ;输入一个数的最高位。 CALL COMPARE;调用子程序进行比较分类 INT 21H ;再输入一个数,这个数无所谓,只是为了屏幕显示好看,成绩大小已经统计出来了 MOV AH,2 MOV DL,32 INT 21H ;显示空格,将成绩分隔开 LOOP S ;循环输入每一个成绩 CALL OUTPUT;调用子程序进行输出 MOV AH,4CH INT 21H ;程序结束 COMPARE PROC ;定义子程序COMPARE,比较最高位数值 PUSH AX CMP AL,31H ;最高位与1比较相等则跳转到G10 JZ S10 CMP AL,36H ;最高位与6比较 JZ S6 ;相等则跳转到G6 CMP AL,37H ;最高位与7比较 JZ S7 ;相等则跳转到G7 CMP AL,38H ;最高位与8比较 JZ S8 ;相等则跳转到G8 CMP AL,39H ;最高位与9比较 JZ S9 ;相等则跳转到G9 JMP S0 ;最高位在1和6之间的就跳转到无效成绩 S0: ADD [OUTSCORE],1 ;无效成绩加一 JMP OVER S6: ADD [SSCORE6],1 ;60-69的人数加一 JMP OVER S7: ADD [SSCORE7],1 ;70-79的人数加一 JMP OVER S8: ADD [SSCORE8],1 ;80-89的人数加一 JMP OVER S9: ADD [SSCORE9],1 ;90-99的人数加一 JMP OVER S10: ADD [SSCORE10],1 ;100的人数加一 MOV AH,1 INT 21H ;输入十位 OVER:POP AX RET ;返回主程序 COMPARE ENDP ;COMPARE子程序结束 OUTPUT PROC ;定义子程序OUTPUT LEA DX,SCORE6 MOV AH,9 INT 21H ;屏幕显示score6的统计人数 MOV DL,[SSCORE6] MOV AH,2 INT 21H ;显示60-69人数 MOV DL,10 INT 21H ;换行 LEA DX,SCORE7 MOV AH,9 INT 21H ;显示提示输出SCORE7 MOV DL,[SSCORE7] MOV AH,2 INT 21H ;显示70-79人数 MOV DL,10 INT 21H ;换行 LEA DX,SCORE8 MOV AH,9 INT 21H ;显示提示输出SCORE8 MOV DL,[SSCORE8] MOV AH,2 INT 21H ;显示80-89人数 MOV DL,10 INT 21H ;换行 LEA DX,SCORE9 MOV AH,9 INT 21H ;显示提示输出SCORE9 MOV DL,[SSCORE9] MOV AH,2 INT 21H ;显示90-99人数 MOV DL,10 INT 21H ;换行 LEA DX,SCORE10 MOV AH,9 INT 21H ;显示提示输出SCORE7 MOV DL,[SSCORE10] MOV AH,2 INT 21H ;显示100人数 MOV DL,10 INT 21H ;换行 LEA DX,SCOREOUT MOV AH,9 INT 21H ;显示提示输出OUTSCORE MOV DL,[OUTSCORE] MOV AH,2 INT 21H ;显示无效成绩 RET ;子程序返回 OUTPUT ENDP ;OUTPUT子程序结束 CODES ENDS END START
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
- 最新
- 最热
只看作者