北京理工大学汇编第四次(分支和循环程序设计实验)报告

时间:2024.4.21

汇编第四次(分支和循环程序设计实验)报告

一、实验要求和目的

1.熟悉汇编语言程序设计结构;

2.熟悉汇编语言分支程序基本指令的使用方法;

3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法;

4.了解汇编语言循环程序设计的基本流程;

5.熟悉汇编语言循环基本指令的使用方法;

6.掌握利用汇编语言的循环指令完成循环程序设计方法。

二、软硬件环境

1、硬件环境:计算机系统 windows;

2、软件环境:装有MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识

在实际应用中,经常根据一些条件来选择一条分支执行。汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号相减产生的结果来进行。

1.无条件转移指令JMP

无条件转移指令JMP是使程序无条件转移至目标处,又分为段内转移、段间转移。

2.条件转移指令JXX

条件转移指令可分为三大类:

1).简单条件转移指令。根据单个标志位的状态判断转移条件。下表表示条件转移指令标志位的状态:

2).无符号数条件转移指令。

假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是A-B,其转移指令如下:

3)带符号数条件转移指令。

在汇编程序设计中,要熟练使用循环指令和跳转指令等来实现循环,理解循环体结构中的初始化部分、循环体、结束部分,并且要结合前面分支结构相关的知识点,加深对循环结构的理解和掌握。循环结构的组成及其设计方法的知识要点有:

1、循环程序的基本结构通常由3部分组成

1) 初始化部分

建立循环初始值,为循环做准备,如设置地址指针,(BX/SI/DI/BP),初始化循环控制变量或计数器(CX),数据寄存器(AX/DX)初值等.

2) 循环体

循环体是循环程序的主体,是程序中重复执行的程序段.它是由循环工作部分、修改部分、和循环控制部分。

①循环工作部分:完成程序功能的主要程序段,用于解决程序的实际任务;

②修改部分:对循环参数进行修改,并为下一次循环做准备;

③循环控制部分:判断循环结束条件是否满足。通常判断循环结束方法:

? 用计数控制循环;循环是否进行了预定的次数。

? 用条件控制循环。循环终止条件是否满足。

3)结束处理处理部分

     主要是对循环的结果进行处理,比如现实提示信息等,很多时候没有此部分程序。

2、循环控制指令:

指令格式        执行操作       循环结束条件

LOOP标号        CX=CX-1;      若CX=0,则循环  CX=0

LOOPNZ/LOOPNE 标号  CX=CX-1;   若CX=0且ZF=0,则循环 CX=0或ZF=0

LOOPZ/LOOPE标号 CX=CX-1;   若CX=0且ZF=1,则循环 CX=0或ZF=1

JCXZ 标号      仅测试(CX)=0? 若等于0,则转移到目标地址,否则顺序执行

3、循环控制可以分为:计数循环和条件循环。作为计数循环,一般是指循环次数是已知的情况,在程序设计的的循环时,先应将循环次数送入计数器CX中进行计数,在循环体中使用LOOP等循环指令。当然,也可以通过其他方式来进行,如cx←cx-1,jnz 等结合实现。

四、实验内容与步骤

1、判断方程AX2+BX+C=0 是否有实根。若有实根,则将字节变量tag置1,否则置0。假设A、B、C均为字节变量,数据范围为-128~127。

流程图如下:

北京理工大学汇编第四次(分支和循环程序设计实验)报告

(1)代码

data segment

      A db 5

      B db 10

      C db 5

      tag db 0

data ends

code segment

assume cs:code,ds:data

start:

     mov ax,data

     mov ds,ax

     mov al,B

     mul al

     mov cx,ax

     mov al,A

     mul C

     mov bx,ax

     mov ax,4

     mul bx

     sbb ax,cx

     cmp ax,0

     jl yep

    jmp nope

yep:

     mov al,1

     mov tag,al

nope:

     mov ah,4ch

     int 21h

code ends

end start

(2)主要操作

初始值a=5,b=10,c=5    显然有实根

使用-u、-g 命令查看结果,可知确实有tag=al=1

更改a=1,b=1,c=1,再次查看知al未赋值“1”,故tag仍为初始值“0”

-q退出

2、编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z字符,显示“C”;若为a-z 字符,显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则显示显示“R”。

流程图如下:

北京理工大学汇编第四次(分支和循环程序设计实验)报告

(1)代码

data segment

     char db ?

data ends

stack segment

stack ends

code segment

     assume cs:code,ss:stack,ds:data

start:

     mov ax,data

     mov ds,ax

     mov ah,1h

     int 21h

     cmp al,0Dh               

     JE END1                  

     CMP AL,39H

     jbe l1

     jmp l2

l1:  cmp al,31h

     jae s1

     jmp end0

l2:  cmp al,41h

     jb end0

     cmp al,59h

     jbe end2

     jmp l3

l3:  cmp al,61h

     jb end0

     cmp al,79h

     jbe end3

     jmp END0 

s1:  mov dl,al

     mov ah,02

     int 21h

     jmp end1

end0:

     mov dl,52h

     mov ah,02

     int 21h

     jmp end1

end2:

     mov dl,43h

     mov ah,02h

     int 21h

     jmp end1

end3:

     mov dl,63h

     mov ah,02h

     int 21h

     jmp end1

end1:

     mov ah,4ch

     int 21h

code ends

end start

(2)主要操作

分别输入9 d G ’以及回车,使用-t、-g指令查看结果如下,满足要求

3、分类统计字数组data中正数、负数和零的个数,并分别存入内存字变量Positive、Negative和Zero中,数组元素个数保存在其第一个字中。使用Debug查看Positive、Negative和Zero三个变量的数据。

流程图如下:

北京理工大学汇编第四次(分支和循环程序设计实验)报告

(1)代码

data segment

    buf db 9,5,4,2,0,0,0,-1,-2,-3

    positive dw 0

    negative dw 0

    zero dw 0

data ends

code segment

    assume cs:code,ds:data

start:

    mov ax,data

    mov ds,ax

    mov si,0

    mov cx,10

s: 

    cmp cx,0

    je done

    dec cx

    cmp byte ptr [si],0

    je s1

    jg s2

    jl s3

s1:  inc zero

    inc si

    jmp s

s2:  inc positive

    inc si

    jmp s

s3:  inc negative

    inc si

    jmp s

done:

    mov ax,positive

    mov bx,zero

    mov dx,negative

    mov ah,4ch

    int 21h

code ends

end start

(2)主要操作

    易知,按输入数据buf db 9,5,4,2,0,0,0,-1,-2,-3  结果应为四个正数,3个零,三个负数

即ax=4、bx=3、dx=3,使用-u、-g指令查看寄存器结果如下图:

结果正确!

-q退出即可。

4、编写程序,在字符串变量STRING中存有一个以$为结尾的ASCII码字符串,要求计算字符串的长度,并把它存入LENGTH单元中。(要求用条件控制循环方法,并且字符串分数据类型是字节和字两种情况)DB型

(1)代码:

data segment

    STRing db 'sabersaberExcalibur$'         

    len db ?

data ends

code segment

    assume cs:code,ds:data                             

start:

    mov ax,data

    mov ds,ax                                     

   mov ax,0

    mov di,0

s:  cmp byte ptr [di],'$'

    jz end1

    inc di

    inc ax

    JMP s

end1:

    mov word ptr [len],ax

    mov ax,4ch

    int 21h

code ends

end start                                           

(2)操作:查看寄存器AX=13(即十进制19),与输入吻合,检测成功

DW型

(1)代码

DATA SEGMENT

    BUF DB 'S','A','B','E','R','$'

    L DB 0

DATA ENDS

CODE SEGMENT

    ASSUME CS:CODE,DS:DATA

START:

    MOV AX,DATA

    MOV DS,AX

    MOV SI,0

L1: MOV AL,BUF[SI]

    CMP AL,'$'

    JE DONE

    INC L

    INC SI

    JMP L1

DONE:

    MOV AL,L

    MOV AH,4CH

    INT 21H

CODE ENDS

END START

(2)操作:查看寄存器AX=5,与输入吻合,检测成功

由于一些极端情况比如当源字符串为“ssssssssss”,子串为“ss”时子串数量究竟应当有多少,按照之前给出的算法,第一次循环结束后,si=1,再次比较时会从第三个“s”开始,即结果只有五个子串,实际上子串应当有9个,所以简化的算法其实有错误,故使用保守做法:

data segment

  str1 db 'ssssssssss','$'

  len1 equ $-str1

  str2 db 'ss'

  len2 equ $-str2

  count db 0

data ends

code segment

  assume ds:data,cs:code

start:

    mov ax,data

  mov ds,ax

  mov es,ax

  mov bx,len1

  lea si,str1

bazinga:

    mov cx,len2

    lea di,str2

  cld

  repz cmpsb

  jnz s2

  inc count

  sub si,(len2-1)

s2:

    dec bx

    cmp bx,len2

  jb finish

  jmp s1

done:

    mov dl,count

    add dl,30h

  mov ah,02h

  int 21h

  mov ah,4ch

  int 21h

code ends

end start

    每次循环比较后不论结果均将si依次增加,虽然操作数增加但是可以确保正确。

更多相关推荐:
北京理工大学汇编实验报告 2

算术运算类操作实验1对于两组无符号数087H和034H0C2H和5FH试编程求这两组数的和差积商并考虑计算结果对标志寄存器中状态寄存器的影响程序代码087H034HDATASSEGMENTBUF1DB087HB...

北京理工大学汇编语言实验报告一

汇编语言实验报告实验一DOS环境下的汇编语言编程环境使用基础与验证型班级05211002姓名张宁学号1120xx2310实验日期20xx97晚600900班级05211002姓名张宁学号1120xx2310实验...

北京理工大学汇编语言实验五 子程序设计实验

实验五子程序设计实验设计性实验一实验要求和目的1熟悉汇编语言程序设计结构2熟悉汇编语言子程序设计方法3熟悉利用汇编语言子程序参数传递方法4熟悉汇编语言字符串处理基本指令的使用方法5掌握利用汇编语言实现字符串的输...

北理工汇编语言实验报告6

汇编语言实验报告第六章磁盘文件存取实验设计性实验班级05611102姓名肖枫学号1120xx1431实验日期20xx914下午第六章磁盘文件存取实验设计性实验一实验要求和目的1理解文件目录的概念2了解FCB文件...

北京理工大学汇编实验一实验报告

本科实验报告实验名称DOS环境下的汇编语言编程环境使用实验一DOS环境下的汇编语言编程环境使用基础与验证型一实验要求和目的1掌握汇编语言程序设计的基本流程和学会上机开发简单程序2熟练掌握宏汇编程序MASM的使用...

北京理工大学汇编实验五实验报告

本科实验报告实验名称子程序设计实验实验五子程序设计实验设计性实验一实验要求和目的1熟悉汇编语言程序设计结构2熟悉汇编语言子程序设计方法3熟悉利用汇编语言子程序参数传递方法4熟悉汇编语言字符串处理基本指令的使用方...

20xx年北京理工大学工业设计考研辅导班笔记汇编

才思教育网址20xx年北京理工大学工业设计考研辅导班笔记汇编各位考研的同学们大家好我是才思的一名学员现在已经顺利的考北京理工大学工业设计专业今天和大家分享一下这个专业的笔记方便大家准备考研希望给大家一定的帮助考...

北京理工大学汇编第五次(子程序设计)实验(设计性实验)

汇编第五次子程序设计实验设计性实验一实验要求和目的1熟悉汇编语言程序设计结构2熟悉汇编语言子程序设计方法3熟悉利用汇编语言子程序参数传递方法4熟悉汇编语言字符串处理基本指令的使用方法5掌握利用汇编语言实现字符串...

北京理工大学微机原理汇编语言上机实验题

实验一请在数据段中定义两个数要求编写程序分别计算出这两个数的和差积商并用Debug的相关命令查询计算结果略实验二内存自TABLE开始的连续16个单元中存放着015的平方值查表求DATA中任意数X0X15的平方值...

北京理工大学微机原理实验报告一

本科实验报告实验名称基于并行接口的键盘控制实验一基于并行接口的键盘控制一实验目的1掌握简单并行接口8255的工作原理及使用方法2了解小键盘的工作原理学会设计小键盘的接口技术3利用8255并行接口芯片作为小键盘的...

北京理工大学微机原理实验报告二

本科实验报告实验名称利用中断方式设计数字时钟实验二利用中断方式设计数字时钟一实验目的1掌握PC机中断处理系统的基本原理2熟悉定时计数器8254工作原理及其编程方法3利用实验板上的8254定时器为中断源发中断申请...

20xx年北京理工大学电路、信号与系统考研真题(完整版)凯程首发

凯程考研集训营为学生引路为学员服务20xx年北京理工大学电路信号与系统考研真题完整版凯程首发刚考完20xx考研初试凯程教育的电话瞬间变成了热线同学们兴奋地汇报自己的答题情况几乎所有内容都在凯程考研集训营系统训练...

北京理工大学汇编实验报告(13篇)