qq_57078501 2021-06-14 14:21 采纳率: 50%
浏览 13

修改汇编语言编写的程序 大佬们,帮帮忙啊!谢谢了

请把下面的程序修改成可以输入100的程序(现在的程序无法输入100进行运行)

18,在输入十个学生成绩后,在界面显示及格人数x个,不及格人数y个。

 

 

DISP_STR MACRO X;宏定义:提示信息显示。

         MOV DX,OFFSET X

         MOV AH,09H

         INT 21H

ENDM

DRLF     MACRO;宏定义:回车换行。

         MOV DL,0DH;回车

         MOV AH,02H;系统功能调用

         INT 21H

         MOV DL,0AH;换行

         MOV AH,02H

            

         INT 21H

ENDM

 

DATA SEGMENT;数据段,对字符串和操作数进行定义。

MSG1 DB 'Please input ten scores:','$'

MSG2 DB 'Input error!','$'

MSG3 DB 'Ten scores are:','$'

MSG4 DB 'The number of students who have passed the exam is:','$'

MSG5 DB 'The number of students who have failed the exam is:','$'

MSG6 DB 'Please input ten scores again:','$'

BUF  DB  128 DUP(0)

DATA ENDS

 

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: 

      MOV AX,DATA

      MOV DS,AX

      

      DISP_STR MSG1;提示输入信息。

      MOV CX,10    ;循环输入十个两位十进制数据。

      MOV SI,0     ;设置数据区的首地址。

IN_LOOP:

      MOV AH,1     ;以下8行是输入一个数据的第一个字符。

      INT 21H

      CMP AL,'0'   

      JB IN_ERROR

      CMP AL,'9'   ;若输入的字符的ASCII字符比'0'小或比'9'大,提示输入错误。

      JA IN_ERROR

      MOV [BUF+SI],AL

      INC SI       ;每输入一个字符,地址加1。

      

      MOV AH,1     ;以下8行是输入一个数据的第二个字符。

      INT 21H

      CMP AL,'0'

      JB IN_ERROR

      CMP AL,'9'

      JA IN_ERROR

      MOV [BUF+SI],AL

      INC SI

      

      MOV AH,1     ;输入时用空格将输入的数据隔开,但空格并不保存在内存中,

      INT 21H      ;即输入的数据在内存中是连续存放的。

    

      LOOP IN_LOOP ;一个数据输入完,输入下一个数据。

      JMP OUT_PUT1 ;十个数据输入完之后,跳转到out_put1。

       

IN_ERROR:               ;输入错误时,提示输入“input error”。

         DISP_STR MSG2  ;换行提示重新输入十个数据。

         DRLF

         DISP_STR MSG6

         MOV SI,0

         MOV CX,10

         JMP IN_LOOP

          

OUT_PUT1:          ;out_put1是提示输出信息。

      DRLF

      DISP_STR MSG3

     

      MOV SI,0

      MOV CX,10

OUT_PUT2:          ;out_put2是在屏幕上显示输出输入的十个分数。

      MOV DL,[BUF+SI] ;以下四行是输出一个数据的第一个字符。

      INC SI

      MOV AH,2

      INT 21H

      

      MOV DL,[BUF+SI] ;以下四行是输出一个数据的第二个字符。

      INC SI

      MOV AH,2

      INT 21H

      

      MOV DL,' '      ;输出显示的两数据之间用空格隔开。

      MOV AH,2

      INT 21H

      

      LOOP OUT_PUT2   ;一个数据输出完,输出下一个数据。

        

     MOV CX,20        ;以下deal1, deal2, deal3是对十个数据进行处理。

     MOV SI,0 

DEAL1:                ;deal1 是将每个字符的ASCII值减去30H得到该字符的真值。

     MOV AL,[BUF+SI]  

     SUB AL,30H

     MOV [BUF+SI],AL 

     INC SI

     LOOP DEAL1

     

     MOV SI,0

     MOV CX,10

DEAL2:                ;deal2 是将偶地址中真值乘以10再加上紧跟其后的奇地址中的真值

     MOV AL,[BUF+SI]  ;从而得到输入的两位十进制数的真值,并将此真值以字的形式

     MOV BH,0         ;存入以buf为始的内存单元。

     MOV BL,[BUF+SI+1]

     MOV DH,10

     MUL DH

     ADD AX,BX

     MOV WORD PTR[BUF+SI],AX

     ADD SI,2

     LOOP DEAL2

     

     MOV BL,0

     MOV SI,0

     MOV CX,10

DEAL3:                        ;deal3 是将得到的分数与59作比较。

      MOV AX,WORD PTR[BUF+SI] ;若大于59,则及格,转移到count记数。

      ADD SI,2                ;

      CMP AX,59

      JA COUNT

RETURN:                       ;return是返回,判断完一个数以后进行下一个数的判断。             

       LOOP DEAL3

       JMP OUT_PUT3           ;如果判断完,则转移到out_put3.

COUNT:                        ; count是用于记数,记录及格的人数。

      INC BL

      JMP RETURN

OUT_PUT3:                     ;out_put3是用于显示及格与否的人数。

      DRLF

      DISP_STR MSG4           ;先显示及格人数。

      MOV DL,BL

      ADD DL,30H

      MOV AH,2

      INT 21H

      

      DRLF

      DISP_STR MSG5           ;再显示不及格人数。

      MOV DL,10

      SUB DL,BL

      ADD DL,30H

      MOV AH,2

      INT 21H

      

PRO_END:                      ;程序结束,返回DOS。

      MOV AH,4CH

      INT 21H

CODE ENDS

END START

  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-03-17 08:53
    关注

    参考GPT和自己的思路:

    可以将MOV CX,10改为MOV CX,100,这样程序就可以输入100个分数了。同时,在进行显示及格人数与不及格人数的操作时,需要将判断分数的循环从原来的10个数改为100个数,将MOV CX,10改为MOV CX,100即可。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog