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
              
  • 相关阅读:
    @RequestParam注解使用:Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.
    cglib动态代理导致注解丢失问题及如何修改注解允许被继承
    springboot Autowired BeanNotOfRequiredTypeException
    git根据用户过滤提交记录
    不同包下,相同数据结构的两个类进行转换
    How to use Jackson to deserialise an array of objects
    jooq实践
    java如何寻找main函数对应的类
    Python--matplotlib
    Python 和 Scikit-Learn
  • 原文地址:https://www.cnblogs.com/lfri/p/10784887.html
Copyright © 2011-2022 走看看