汇编第四次实验

[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
喜欢就支持以下吧
点赞10赞赏 分享
评论 共1条

请登录后发表评论