Emu8086三种格式的代码-(顺序,分支,循环)

这个学期准备考研,于是就没有怎么听别的课,现在临近期末,汇编成了个难题。下面是我学校的实验报告

做一个复习的记录吧,下面的代码都是在Emu8086上运行出来的代码

下面先介绍一下,汇编里面的格式问题

简化段格式定义.MODEL SMALL ;定义程序的存储模式

.MODEL SMALL   ;定义程序的存储模式
.STACK          ;定义堆栈段
.DATA           ;定义数据段

.......             ;数据定义

.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容

.......             ;程序定义

.EXIT 0         ;程序结束点,返回DOS

.......            ;子程序定义

END             ;汇编结束

  

完整段定义格式

STACK SEGMENT STACK         ;定义堆栈段STACK
    .....                   ;分配堆栈段的大小

STACK ENDS                  ;堆栈段结束
DATA  SEGMENT               ;定义数据段DATA
    .....                   ;定义数据  

CODE SEGMENT ‘CODE‘         ;定义代码段
    ASSUME CS:CODE,DS:DATA,SS:STACK
    ;确定CS/DS/SS指向的逻辑段
    START :MOV AX,DATA
    MOV DS,AX           ;设置数据段的段地址DS

    ......              ;程序代码

    MOV AX,4C00H        ;返回DOS
    INT 21H

    ......              ;子程序代码

    CODE ENDS
ENDS START              ;汇编结束

顺序语句

前提的知识,AL和AH都是8位的寄存器.AL是低字节,AH是高字节。(很好理解,HHHH就是高的意思嘛)

.MODEL SMALL    ;定义程序的存储模式
.STACK          ;定义堆栈段
.DATA           ;定义数据段

X DB 8CH        ;定义了一个名为DB类型的X
Y DB 64H        ;定义了一个名为DB类型的Y
Z DB 0H         ;定义了一个名为DB类型的Z

.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容

MOV AL,X        ;把X的内容传递到AL里面
ADD AL,Y        ;把AL的内容和Y的内容相加
MOV AH,00H      ;把AH里面的值清0
ADC AH,00H      ;把CF里面的值给AH

MOV BL,2        ;赋值BL为2
DIV BL          ;把让AL除以BL,并把结果赋值给AL
MOV Z,AL        ;把AL给Z

.EXIT 0         ;程序结束点,返回DOS
END             ;汇编结束

  分支结构

单分支结构

知识前提:

CMP是比较指令,将目标操作数与源操作数相减,不送回结果,只根据结果置标志位。

CMP dest,src      ;(dest)-(src)

CMP A,B

① 判断是否相等

看ZF ,ZF=1,A=B,   ZF=0  A ≠B

② 判断两个操作数的大小

无符号的

CF=1 ,A<B     CF=0 ,A≧B

有符号的,SF⊕OF,看SF和OF的异或

SF⊕OF=1 ,A<B     SF⊕OF=0 ,A≧B

代码如下

.MODEL SMALL
.STACK          ;定义堆栈段
.DATA           ;定义数据段

RESULT DW 0     ;DW是16位的类型

.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容

MOV AX,1        ;把寄存器存到AX 1里面

CMP AX,0        ;把寄存器和AX里面相比,大于的地方就跳转,
                ;小于的话就不跳转

JGE     NONNEG          ;分支条件:AX>=0
NEG     AX              ;NEG是取补指令,
;NEG将操作数取补数,然后在末尾位+1

;条件不满足,为负数,需要执行分支体进行求补
NONNEG: MOV RESULT,AX       ;条件满足,为正数,保存结果
        ;NONNEG就是一个符号位置,跳转的位置.

.EXIT 0         ;程序结束点,返回DOS

END             ;汇编结束 

  多分支结构

前提的知识。

带符号数的乘积

IMUL  reg/mem    ;dest 隐含着被乘数AL/AX乘以乘数reg/men

JGE /JNL SF=OF   ;若大于等于则转移

.MODEL SMALL   ;定义程序的存储模式
.STACK          ;定义堆栈段
.DATA           ;定义数据段

    _A  DB  00H
    _B  DB  00H
    _C  DB  00H
                    ;    _D  DB  0H
    TAG DB  00H
    ;定义了四个变量,_A,_B,_C,_D
    ;他们都是DB类型的

.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容

      MOV AL,_B     ;把_B里面的值赋值给AL
      IMUL AL        ;IMUL 是带符号的乘法指令,
      ;完成两个带符号的8位或16位2进制数乘法计算.
      ;将AL的内容乘以_B 乘积放入到AL中.
      ;乘积存放在AH,AL,DX,AX中。
      MOV BX,AX      ;BX把AX中的值传递给BX,BX里面为B*B
      MOV AL,_A      ;在把_A的值给AL
      IMUL _C        ;把AL的值和_C的值想乘,结果放入到此AX中
                       ;现在AX里面为AC

      MOV CX,4       ;把4给CX
      IMUL CX        ;AL的值乘4,结果给AX
                      ;AX现在里面的值是4AC

      CMP BX,AX      ;将AX和BX进行比较
      ;BX-AX会标志位会产生改变
      ;SF OF
      JGE YES         ;如果BX大于AX的话 TAG=0
      MOV TAG,0         ;分支语句体1:条件不满足,TAG<-0 

      JMP DONE         ;BX小于AX的话,TAG=1
YES:  MOV TAG,1

DONE:
        .EXIT 0        ;程序结束点,返回DOS

        END             ;汇编结束 

循环结果

.MODEL SMALL   ;定义程序的存储模式
.STACK          ;定义堆栈段
.DATA           ;定义数据段

    SUM DW 00H    ;设置一个SUM类型为DW函数值为0H            

.CODE            ;定义代码段
.STARTUP         ;程序起始点,并建立DS,SS内容

    XOR AX,AX           ;XOR是把操作数"异或"
    ;这就是一个置零功能
    MOV CX,100          ;把100这个立即数送给CX

    AGAIN:ADD    AX,CX  ;AGAIN就是循环的标识符
    LOOP AGAIN      ;执行LOOP的时候,自动将CX里面的内容减一
    ;直到CX里面的值为0

    MOV SUM,AX      ;把AX里面的值送给SUM

.EXIT 0         ;程序结束点,返回DOS

END             ;汇编结束

  

原文地址:https://www.cnblogs.com/a-small-Trainee/p/12024660.html

时间: 2024-11-05 21:57:32

Emu8086三种格式的代码-(顺序,分支,循环)的相关文章

iOS开发——程序员必备&amp;iOS安装包的三种格式 deb、ipa 和 pxl的解释和说明

iOS安装包的三种格式 deb.ipa 和 pxl的解释和说明 目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl.转自链接:http://fanlb.blogbus.com/logs/80466716.html  多谢作者分享!其中 deb 格式是 Debian 系统(包含 Debian 和 Ubuntu )专属安装包格式,配合 APT 软件管理系统,成为了当前在 Linux 下非常流行的一种安装包.进入 2.x 时代之后有 Cydia 作者 Jay Freeman(sauri

对比XML JSON INIDG 三种格式

在移动与WEB开发时,避免不了服务端与客户端数据交换,需要从多种格式中找到一种合适的 主要考虑两点,数据量小,解析快速,支持工具丰富 json(JavaScript Object Notation) 一般用于WEB和移动应用的网络数据交换 优点: 可以被JS原生解析 应用广泛,适合于数据交换处理,被于WEB和移动应用开发,所以服务端与客户端一般被要求同时支持JSON 数据量小,易于解析,因为格式简单,只有数组,对象和普通文本 缺点: 肉眼可读性差, 字符类型与数值类型容易混淆 举例 ["str1

Mysql Binlog三种格式介绍及分析【转】

一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在binlog中. 优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能.(相比row能节约多少性能 与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条 件的update操作,以及整表

3.2代码结构(顺序+分支+循环)+函数

代码结构 通常将代码的执行结构分成三种:顺序结构,分支结构,循环结构 顺序结构 代码从上往下一次执行. 分支结构 给定条件,不同的条件下产生的结果应该不一样. 分支结构:通过条件的判断,选择性的执行相应的代码. 分支结构有两种:if分支,switch分支 if分支 最简语法 if(条件表达式){ //条件表达式返回的结果是true //要执行的代码块 } 标准分支语法 if(条件表达式){ //true所要执行的代码块 }else{ //false所要执行的代码块 } 复杂(复合)语法 if(条

三种弹窗提醒代码范例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

大钟的ios开发之旅(4)————简单谈谈ios程序界面实现的三种方式(代码创建,xib和storyboard)

/******************************************************************************************** * author:[email protected]大钟 * E-mail:[email protected] *site:http://www.idealpwr.com/ *深圳市动力思维科技发展有限公司 * http://blog.csdn.net/conowen * 注:本文为原创,仅作为学习交流使用,转

JS中函数定义的三种格式

第一种:function  fun1(参数1,参数2...){            //通过创建函数名来定义函数 函数体: } 第二种:var fun2=new Function("参数1,参数2...","函数体");         //通过创建变量来定义函数 第三种:function(){                //匿名函数 函数体: } 说明: 1,在调用时,可以为没有参数的函数传递参数:但如果没有传递参数给有参数的函数时,会默认参数为undefi

set的三种遍历方式-----不能用for循环遍历(无序)

set的三种遍历方式,set遍历元素 list 遍历元素 http://blog.csdn.net/sunrainamazing/article/details/71577662 set遍历元素 http://blog.csdn.net/sunrainamazing/article/details/71577893 map遍历元素 http://blog.csdn.net/sunrainamazing/article/details/71580051 package sun.rain.amazi

dom4j解析xml的三种方式java代码

虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 <?xml version="1.0" encoding="UTF-8"?>