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]之前要显示给出段地址所在寄存器


  • 相关阅读:
    SQLite Select语句的意外发现
    和一个经理人谈话的经典语句
    [转]如何动态增长一个数组的大小
    [转]Spring AOP中文教程
    为Wildfish框架增加方法调用日志[Aspectsharp]
    第四周学习心得
    《大道至简:软件工程实践者的思想》观后感
    第三周学习心得
    暑假第一周Java学习心得
    第二周学习心得
  • 原文地址:https://www.cnblogs.com/meihao1203/p/7546035.html
Copyright © 2011-2022 走看看