汇编实验二 分支与循环程序设计

 

实验二 分支与循环程序设计

一、实验目的

1、掌握程序设计中的3种基本结构(顺序结构、选择程序、循环程序)。

2、熟练使用汇编语言的指令:数据传送类指令、数据运算类指令、逻辑判断类指令与转移指令、循环指令等。

3、初步了解系统功能调用的使用方法,尝试使用01H号功能调用进行字符输入的方法及使用02H号功能调用进行字符输出(显示)的方法。

二、实验环境与设备

计算机一台,并且安装Windows操作系统和macro assembler 5.0以上版本的系统软件。

三、预备知识

1、掌握汇编语言程序的上机步骤

    2、掌握DEBUG的使用方法

3、掌握汇编语言的指令

( 1 )数据传送类指令。

( 2 )数据运算类指令。

( 3 )逻辑判断类指令。

( 4 )与转移指令。

( 5 )循环指令等。

 

四、程序说明

      1. 计算1+2+3+…+10,将结果显示在屏幕上。
      2. 利用01H号功能调用输入10个一位数字,并将其由ASCII码转换为二进制数,依此保存到变量BUF的10个字节中,变量BUF的形式为BUF  DB  10  DUP(?)。编程求出这10个数中的最大数和最小数,将最大数存入MAX单元、最小数存入MIN单元,并将其在屏幕上显示出来。
      3. 对于第2题,怎样修改程序可以同时实现将10个数字的累加功能。(选作)
      4. 对于第2题,若要求输入的是两位数,又该怎么办?(选作)

五、实验要求

1、上机前要作好充分准备,包括程序框图、源程序清单、调试步骤、测试方法、对运行结果的分析等。

2、要熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。在程序的调试过程中,有意识地学习及掌握debug程序的各种操作命令,以便掌握程序的调试方法及技巧。

3、程序调试完后,须由实验辅导教师在机器上检查运行结果,经教师认可后的源程序方可通过打印输出。每个实验完成后,应写出实验报告。实验报告的要求如下:

(1)实验目的:对本次实验的目的加以说明。

(2)实验内容:本次实验你所完成的具体内容加以说明。

(3)设计思想:绘制程序框图,并说明原理及算法、程序及数据结构、主要符号名等。

(4)程序代码:经辅导教师确认后的程序清单。

(5)结果分析:包括调试情况,如上机时遇到的问题及解决办法、观察到的现象及其分析.对程序设计技巧的总结及分析;程序的输出结果及对结果的分析;实验的心得体会等。

 

 

第一题

求1+2+3…+9

 

DATA SEGMENT  ;数据段

                      ;定义变量

DATA ENDS

 

STACK SEGMENT STACK ;堆栈段

                      ;定义

                      ;DB 200 DUP(?)

                      DW 40 DUP(0)

STACK ENDS;

 

CODE SEGMENT ;//代码段

                     ASSUME DS:DATA,CS:CODE,SS:STACK

START:

                     MOV  AX,DATA

                     MOV  DS,AX

                     MOV  AX,STACK

                     MOV  SS,AX

                     ;你的源代码

                     

                     

                     MOV  CX,10;

                     MOV  AX,0;

                     MOV  DX,1;

                     

                     L1:

                     ADD AX,DX;

                     INC DX;

                     

                     LOOP L1

                     

                     MOV BL, 10

                     DIV BL

                     MOV BH,AH;

                     MOV BL,AL;

                     

                     MOV DL, BL

                     ADD DL, '0'

                     MOV AH, 02

                     INT 21H

                     

                     MOV DL, BH

                     ADD DL, '0'

                     MOV AH, 02

                     INT 21H

                     

                     MOV AH,4CH

                     INT 21H

                     

CODE ENDS

END START

第二题

          利用01H号功能调用输入10个一位数字,并将其由ASCII码转换为二进制数,依此保存到变量BUF的10个字节中,变量BUF的形式为BUF  DB  10  DUP(?)。编程求出这10个数中的最大数和最小数,将最大数存入MAX单元、最小数存入MIN单元,并将其在屏幕上显示出来。

 

DATA SEGMENT  ;数据段

                      ;定义变量

                      BUF db 10 dup(?)

                      max db ?

                      min db ?

                     

                      S1 db 0DH,0AH,'input:','$' ;定义S1的内容

                      S2 db 0DH,0AH,'max:','$'  ;定义S2的内容

                      S3 db 0DH,0AH,'min:','$'   ;定义S3的内容

 

DATA ENDS

 

STACK SEGMENT STACK ;堆栈段

                      ;定义

                      ;DB 200 DUP(?)

                      DW 40 DUP(0)

STACK ENDS;

 

CODE SEGMENT ;//代码段

                     ASSUME DS:DATA,CS:CODE,SS:STACK

START:

                     mov  AX,DATA

                     mov  DS,AX

                     mov  AX,STACK

                     mov  SS,AX

                     ;你的源代码

                     

                     mov cx,10;

                     l1:

                     lea dx,S1;

                    

                     mov ah,09;

                     int 21h;

                    

                     mov ah,01h; 输入

                     int 21h;

                    

                     mov buf[si],al;

                     inc si;

                     

                     loop l1;

                     

                     mov cx,9;

                     mov si,0;

                     mov al,buf[si];

                     mov bl,al;

                     

                     

                     l2:

                    

                     inc si;

                     mov dl,buf[si];     

                    

                     cmp dl,al;

                     jl compare1; 如果dl<al

                    

                     mov al,dl;      al存更小的数

                    

                     compare1:

                            cmp bl,dl;

                           

                            jl compare2;

                           

                            mov bl,dl;

                    

                     compare2:

                           

                    loop l2;

                    

                     mov max,al;

                     mov min,bl;

                     

                     lea dx,S2;

                     mov ah,09;

                     int 21h;

                     

                     mov dl,max;

                     mov ah,02h;

                     int 21h;输出最大数字

                     

                     lea dx,s3;

                     mov ah,09;

                     int 21h;

                     

                     mov dl,min;

                     mov ah,02h;

                     int 21h;输出最小数字

                     

                     MOV AH,4CH

                     INT 21H

                     

                     

CODE ENDS

END START

第三题

对于第2题,怎样修改程序可以同时实现将10个数字的累加功能。(选作)

 

DATA SEGMENT  ;数据段

                      ;定义变量

                      BUF db 10 dup(?)

                      max db ?

                      min db ?

                      sum db ?

                      S1 db 0DH,0AH,'input:','$' ;定义S1的内容

                      S2 db 0DH,0AH,'max:','$'  ;定义S2的内容

                      S3 db 0DH,0AH,'min:','$'   ;定义S3的内容

                      S4 db 0DH,0AH,'sum:','$'  ;定义S4的内容

                     

DATA ENDS

 

STACK SEGMENT STACK ;堆栈段

                      ;定义

                      ;DB 200 DUP(?)

                      DW 40 DUP(0)

STACK ENDS;

 

CODE SEGMENT ;//代码段

                     ASSUME DS:DATA,CS:CODE,SS:STACK

START:

                     mov  AX,DATA

                     mov  DS,AX

                     mov  AX,STACK

                     mov  SS,AX

                     ;你的源代码

                     

                     mov cx,10;

                     l1:

                     lea dx,S1;

                    

                     mov ah,09;

                     int 21h;

                    

                     mov ah,01h; 字符输入

                     int 21h;

                   

                    

                    

                     mov buf[si],al;

                    

                     ;mov bl,buf[si];

                     ;sub bl,30h;

                     ;add dl,bl;

                   

                    inc si;

                     

                     loop l1;

                     

                     ;mov sum,dl;

                     

                     mov cx,9;

                     mov si,0;

                     mov al,buf[si];

                     mov bl,al;

                     

                     l2:

                    

                     inc si;

                     mov dl,buf[si];     

                    

                     cmp dl,al;

                     jl compare1; 如果dl<al

                    

                     mov al,dl;      al存更小的数

                    

                     compare1:

                            cmp bl,dl;

                           

                            jl compare2;

                           

                            mov bl,dl;

                    

                     compare2:

                           

                    loop l2;

                    

                     mov max,al;

                     mov min,bl;

                     

                     lea dx,S2;

                     mov ah,09;

                     int 21h;

                     

                     mov dl,max;

                     mov ah,02h;

                     int 21h;输出最大数字

                     

                     lea dx,S3;

                     mov ah,09;

                     int 21h;

                     

                     mov dl,min;

                     mov ah,02h;

                     int 21h;输出最小数字

                     

                     lea dx,S4;

                     mov ah,09;

                     int 21h;

                     

                    sub ax,ax;

                    mov bx,0;

                    mov cx,10;

                    mov si,0;

                   

                    sum1:

                     mov bl,buf[si];  求和

                     inc si;

                     sub bl,30h;

                     add ax,bl;

                    loop sum1

                   

                     ;mov ax,sum;

                     

                     mov bl,10;

                     div bl;

                     mov bh,ah;

                     mov bl,al;

                     

                     mov dl,bl;商

                     add dl,'0';

                     mov ah,02;

                     int 21h;

                     

                     mov dl,bh;余数

                     add dl,'0';

                     mov ah,02;

                     int 21h;

                     

                     MOV AH,4CH

                     INT 21H

                     

                     

CODE ENDS

END START

                     第四题

对于第2题,若要求输入的是两位数,又该怎么办?(选作)

 

DATA SEGMENT ;数据段

                    ;定义变量

                    BUF DB 10 DUP(?)

                    MIN DB ?

                    MAX DB ?

                    TIP1 DB 0DH, 0AH, 'Please input:', '$'

                    TIP2 DB 0DH, 0AH, 'MAX:', '$'

                    TIP3 DB 0DH, 0AH, 'MIN:', '$'

DATA ENDS

 

CODE SEGMENT ;代码段

                    ASSUME DS:DATA, CS:CODE          ;寻址伪指令

                    MAIN PROC FAR

                     MOV AX, DATA

                     MOV DS, AX

                    

                     MOV CX, 10         ;循环次数10

                     MOV SI, 0            ;BUF偏移量

                    

                    INPUT:

                     LEA DX, TIP1

                     MOV AH, 09

                     INT 21H

                     MOV AH, 01

                     INT 21H

                     SUB AL, '0'

                     CBW

                     MOV BL,10

                     MUL BL

                     MOV DL, AL

                     MOV AH, 01

                     INT 21H

                     SUB AL, '0'

                     MOV AH, 0

                     ADD AL, DL

                     MOV BUF[SI], AL

                     INC SI

                     LOOP INPUT

                    

                     MOV CX, 9

                     MOV SI, 0

                     MOV AL, BUF[SI] ;AL存最大值

                     MOV BL, AL        ;BL存最小值

                                  

                    COM:

                     INC SI

                     MOV DL, BUF[SI]

                     CMP BL, DL

                     JL LESS               ;最小值<当前,与最大比较

                     MOV BL, DL        ;反之更新最小值

                     JMP GREATER

                    

                    LESS:

                     CMP AL, DL

                     JG GREATER       ;最大值>当前,返回比较

                     MOV AL, DL        ;反之更新最大值

                    

                    GREATER:

                     LOOP COM

                    

                    PRINT:

                     MOV MAX, AL

                     MOV MIN, BL

                    

                     LEA DX, TIP2

                     MOV AH, 09

                     INT 21H

                     MOV AX, 0

                     MOV AL, MAX

                     MOV BL, 10

                     DIV BL

                     ADD AL, '0'

                     MOV DL, AL

                     MOV CH, AH

                     MOV AH, 02

                     INT 21H

                     ADD CH, '0'

                     MOV DL, CH

                     MOV AH, 02

                     INT 21H

                    

                    

                     LEA DX, TIP3

                     MOV AH, 09

                     INT 21H

                    

                    

                     MOV AL, MIN;类型匹配

                     CBW;

                   

                    

                     MOV BL, 10

                     DIV BL

                     MOV BH, AH

                     MOV BL, AL

                    

                     MOV DL,BL;

                     ADD DL,'0';

                     MOV AH,02

                     INT 21H

                    

                     MOV DL,BH

                     ADD DL,'0';

                     MOV AH,02

                     INT 21H

                    

                     MOV AH,4CH

                        INT 21H

                    

                    MAIN ENDP

CODE ENDS

END  MAIN

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值