zoukankan      html  css  js  c++  java
  • 8086汇编语言程序设计——分支

    汇编语言程序和高级语言程序一样,有顺序、分支、循环、子程序四种结构形式。

    计算机程序在执行过程中,可以改变程序的执行顺序,根据一定的条件进行转移,使程序完成更复杂的功能。汇编语言提供了无条件转移指令和条件转移指令。

     一个分支程序的例子

    示例 设计分支程序,实现下列公式计算。X、Y为字型。假设X单元中保存三个数:9,-6,34,分别作判断和计算。

    设计思路:

    (1) 在数据段中定义2个字型变量X、Y,均为带符号数;
    (2) 在X单元中依次取出三个数分别作判断,根据X的大小作分支转移;
    (3) 采用寄存器相对寻址方式(MOV AX,X[SI])取出X的三个值;
    (4) 标号OUT1是各路分支的公共出口。

    程序框图:

    代码:

    ;a.asm  用正常程序格式编写分支程序
    data segment
        x dw 9,-6,34
        y dw 3 dup(?)         ;定义一个变量,占3的字,每个字的内容未知
    data ends
    code segment 
        assume cs:code,ds:data
    start:
        mov ax,data
        mov ds,ax
        mov cx,3        ;循环三次
        mov si,0                
    let0:
        mov ax,x[si]    ;取出X
        cmp ax,0        ;X ≥0jge let1        ;是,转到let1
        mov bx,ax        ;否,计算X*X
        imul bx                
        jmp out1        ;跳到公共出口out1
    let1:
        cmp ax,10        ;X ≥10jge let2        ;是,转到let2
        sal ax,1        ;否,计算2X+3
        add ax,3
        jmp out1        ;跳到公共出口out1
    let2:
        mov bl,6        ;计算X/6
        idiv bl            ;商在al,余数在ah
    out1:
        mov y[si],ax    ;保存Y
        add si,2
        dec cx            ;CX-1
        cmp cx,0                
        jnz let0        ;CX≠0转移到let0
        mov ah,4ch    ;CX=0,程序结束
        int 21h
    code ends
    end start

    条件转移非常多,但基本上看见名字就能明白,可自行百度查阅。

    示例2

    示例 设计分支程序。计算 Y=5X-18,如果结果为负,求绝对值。并显示十进制结果。

    设计思路:

    (1) 用数据段保存X、Y。为简便,X定义为字节,Y定义为字;
    (2) 用符号位SF判断运算结果的正负,为负数则求补(绝对值),如果是正数,直接保存结果;
    (3) 采用将AX中的结果除以10、取得余数的方法获得结果的十进制数;
    (4) 将余数变为ASCII码,用DOS中断调用的2号功能显示出来;
    (5) 用9号功能显示提示信息。

    程序框图:

    代码:

    ;b.asm  计算Y=5X-18,用正常程序格式
    data segment
        x db  -6           ;Define Byte,定义一个字节,
        y dw ?             ;字,?表示内容不确定
        cc  db 0ah,0dh,'Y=$'
    data ends
    code segment 
        assume cs:code,ds:data
    start:
        mov ax,data
        mov ds,ax
        mov al,5        ;5X
        imul x
        sub ax,18        ;-18
        jns let0        ;结果不为负则转移
        neg ax        ;结果为负,求绝对值
    let0:
        mov y,ax        ;保存结果
        ;将ax中的二进制数变为十进制数,并显示
        mov cx,0
        mov bx,10                
    let1:    
        mov dx,0
        inc cx            ;统计余数个数
        idiv bx        ;AX/10,商在AX,余数在DX
        push dx        ;保存余数
        cmp ax,0        ;商为0,则退出循环
        jnz let1
        mov dx,offset cc ;9号功能显示提示
        mov ah,9
        int 21h
    let2:            ;循环执行cx次,显示十进制结果    
        pop ax        ;将余数弹入ax
        add ax,0030h    ;调整为ASCII码
        mov dl,al        ;2号功能,显示一个字符
        mov ah,2
        int 21h
        dec cx
        cmp cx,0
        jnz let2
        mov ah,4ch
        int 21h
    code ends
    end start
              
  • 相关阅读:
    火狐firefox进行post提交测试
    spring cloud:config-eureka-refresh
    spring cloud:config
    使用Docker部署Gitlab
    Docker配置加速器
    spring cloud:eureka
    Sql Server 出现此数据库没有有效所有者问题
    将VS2012的项目转化成VS2010
    SQL Server 2008将数据库数据导出到脚本
    Sql Server 显示插入Identity字段
  • 原文地址:https://www.cnblogs.com/lfri/p/10784887.html
Copyright © 2011-2022 走看看