zoukankan      html  css  js  c++  java
  • [bx]和loop指令

    mov ax , [0]  将一个内存单元的内容送入 ax , 这个内存单元的长度为 2字节字单元);
    mov al , [0]   将一个内存单元的内容送入 al  , 这个内存单元的长度为 1字节字节单元);
    1、[bx]  也表示一个内存单元,它的偏移地址在 bx 中;
    mov ax , [bx]   ; 将一个内存单元的内容送入 ax , 这个内存单元的长度为 2字节(字单元),存放一个字,偏移地址在 bx 中,段地址在 ds 中。
    mov al , [bx]   ; 将一个内存单元的内容送入 ax , 这个内存单元的长度为 1字节(字节单元),存放一个字节,偏移地址在 bx 中,段地址在 ds 中。

    2、loop
    循环

    3、描述性的符号“()”
    “()”表示一个寄存器或一个内存单元中的内容。
    (ax)表示 ax 中的内容、(al)表示 al 中的内容;

    4、约定符号 idata 表示常量
    eg:mov ax , [idata]  代表 mov ax , [1] 、mov ax , [2] 、mov ax , [3] ...
    mov bx , idata 
    mov ds , idata  非法指令

    SA--Segment Address 段地址
    EA--Effective Address  有效地址

    Loop 指令:loop   标号
    ①、(cx)=(cx)-1;   cx 中存放循环次数
    ②、判断 cx 中的值,不为零则转至标号处执行程序,如果为零则向下执行。

    计算2^12次方
    assume cs:code 
    code segment
         mov ax , 2
         mov cx , 11
     s:  add ax , ax
         loop s
         mov ax , 4c00h
         int 21h
    code ends
    end
    mov ax , 2000h        ; 将 ds:bx 单元中的数据送入 al
    mov ds , ax
    mov bx , 0
    mov al , [bx]        ;将 2000h:0 处的值到al中
    mov al , [0]  在debug中和上面作用一样,masm中就是把0放到al中


    mov al , ds:[0]       ; [0] 前显示给出段地址所在寄存器

    注意:masm 中,对 [idata] 解释成 “idata”; 在 debug 中解释成“[idata]”是一个内存单元,idata 是内存单元的偏移地址;
    所以要在源程序中实现将内存 2000:0、2000:1 ... 这样的单元数据送入寄存器,目前的方法就是将偏移地址送入 bx 寄存器中,用 [bx] 的方式来访问内存单元。

    如果要向 debug 中那样显示的接用 [idata] 给出内存单元,就要在 [idata] 前给出段地址所在的段寄存器。

    要将字节单元(8位)数据累加到一个16位寄存器的方法,先把这个8位数据放到一个16位寄存器的低8位,高8位置0,最后在累加到16位的寄存器。
    mov ax , ffffh
    mov ds , ax 
    mov dx , 0            ; 初始化累加器
    mov al , ds:[0]      ; 8位字节单元数据放到ax的低8位
    mov ah , 0           ;高8位置0
    add dx , ax

    在 8086 模式中,不能随意向一段内存空间写入内容,因为可能那段段空间中存放着重要的系统数据或代码。

    编程的时候一般用 0:200~0:300 这段 256 个字节的空间。如果要使用其他的空间,要先看一下这段空间的数据是不是都为0
    将内存 ffff:0~ffff:b 单元中的数据拷贝到 0:200~0:20b 单元中:
    assume cs:code
    code segment
         mov bx , 0
         mov cx , 12
    s:   mov ax , ffffh
         mov ds , ax
         mov dl , [bx]
         mov ax , 0020h
         mov ds , ax
         mov [bx] , dl
         inc bx 
         loop s
         mov ax , 4c00h
         int 21h
    code ends
    end

    最直接的做法,但是每次都两次设置 ds
    改进:
    assume cs:code
    code segment
        mov ax , ffffh
        mov ds , ax
        mov ax , 0020
        mov es , ax      ;用附加段寄存器存放另一个段地址
        mov bx , 0 
        mov cx , 12
    s:  mov dl , [bx]
        mov es:[bx] , dl
        inc bx
        loop s
        mov ax , 4c00h
        int 21h
    code ends
    end

    masm 编译器[idata]之前要显示给出段地址所在寄存器


  • 相关阅读:
    Effective Java 第三版——26. 不要使用原始类型
    Effective Java 第三版——25. 将源文件限制为单个顶级类
    Effective Java 第三版——24. 优先考虑静态成员类
    Effective Java 第三版——23. 优先使用类层次而不是标签类
    Effective Java 第三版——22. 接口仅用来定义类型
    Effective Java 第三版——21. 为后代设计接口
    Effective Java 第三版——20. 接口优于抽象类
    Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
    Effective Java 第三版——18. 组合优于继承
    Effective Java 第三版——17. 最小化可变性
  • 原文地址:https://www.cnblogs.com/meihao1203/p/7546035.html
Copyright © 2011-2022 走看看