汇编学习--7.11--内存寻址

来源:互联网 发布:创业软件经营状态 编辑:程序博客网 时间:2024/05/25 21:34
  • and指令:按位与运算。与0将操作对象的相应位置为0。
             or指令:按位或运算。或1将操作对象的相应位置为1。          
  • ASCII码中,61H表示字符“a”,二进制   0110 0001,将第5位置0变大写。
                               41H表示字符“A”,二进制   0100 0001,将第5位置1变小写。         
  • 大小写字母转换:小写变大写,and al , 1101 1111B   或者  and al , DFH
                                         大写变小写,   or al , 0010 0000B   或者     or al , 20H 
  • 我们可以在程序中,用单引号的方式指明数据以字符形式给出,编译器将他们转化成相应的ASCII码。         
  • SI和DI与bx寄存器功能类似,但不能分解为2个8位寄存器。
  • 不允许两个操作数都是内存单元。           
  • 空格的ASCII码是:20H 
  • 5种内存寻址比较:

         1  [idata]         直接定位一个内存单元

         2  [bx]      用一个变量来表示内存地址,可用于间接定位一个内存地址。

         3  [bx + idata]   用一个变量和常量表示地址,可在一个起始地址基础上变量间接定位。[bx].idata,idata[bx];

         4  [bx + si]   用两个变量 [bx][si]

         5  [bx + si + idata] [bx][si].idata,[bx].idata[si],idata[bx][si].

  • 二重循环问题:外行内列,外部循环用bx做变量,内部循环用si或di做变量,对数组数据或者列表数据做二重循环。循环内部做取值——暂存(内存)——修改——送回。          
  • 暂存的数据存放于内存单元中而非寄存器中,而栈就是一个最好的解决方法。综合示例:

    将数据段中的字母全部变成大写
    assume cs:codesg,ds:datasg,ss:stacksg
    datasg segment
    db 'ibm             '
    db 'dec             '
    db 'dos             '
    db 'vax              '
    datasg ends

    stacksg segment      ;定义一个段,用来作栈段,容量为16个字节
    dw 0,0,0,0,0,0,0,0
    stacksg ends

    codesg segment
    start: mov ax,stacksg
    mov ss,ax
    mov sp,16
    mov ax,datasg
    mov ds,ax
    mov bx,0

    mov cx,4
       s0:  push cx ;将外层循环的cx值压栈
    mov si,0
    mov cx,3                    ;cx设置为内层循环的次数

       s:  mov al,[bx+si]
    and al,11011111b
    mov [bx+si],al
    inc si
    loop s

    add bx,16
    pop cx ;从栈顶弹出原cx的值,恢复cx
    loop s0 ;外层循环的loop指令将cx中的计数值减 1 

    mov ax,4c00h
    int 21h
    codesg ends
    end start
  • 原创粉丝点击