[BX]和内存单元的描述

  • 描述一个内存单元,需要两种信息:
    • 内存段元的地址
    • 内存单元的长度(类型)
  • [BX]同样也变是一个内存单元,他的偏移地址在bx中:
    • mov ax,[bx]
    • mov al,[bx]
  • mov ax,[bx]:(ax)=((ds)*16+bx)

    描述性符号“()”

  • ax中的内容为0010H:(ax)=0010H;

  • 2000:1000出的内容为0010H:(21000H)=0010H;
  • mov ax,[2]:ax=((ds)*16+2);
  • mov [2],ax:((ds)*16+2)=(ax);
  • add ax,2:(ax)=(ax)+2;
  • push ax:(sp)=(sp)-2 ((ss)*16+sp)=(ax)
  • pop ax:(ax)=((ss)*16+sp) (sp)=(sp)+2

    Loop

  • 指令格式:loop标号,CPU执行loop指令的时候:

    • (cx)=(cx)-1;
    • 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行
  • 2^12,结果放在ax;

    1. assume cs:codesg
    2. codesg segment
    3. tong: mov ax,2
    4. mov cx,11
    5. s:add ax,ax
    6. loop s
    7. mov ax,4c00H
    8. int 21H
    9. codesg ends
    10. end tong
    • cx记录loop跳转的次数
    • loop指令中的标号所标识地址要在掐你满

      1. assume cs:codesg
      2. codesg segment
      3. tong:
      4. mov ax,0ffffh
      5. mov ds,ax
      6. mov bx,6
      7. mov al,[bx]
      8. mov ah,0
      9. mov dx,0
      10. mov cx,3
      11. s:add dx,ax
      12. loop s
      13. mov ax,4c00h
      14. int 21h
      15. codesg ends
      16. end tong
    • 十六进制是0~F,在书写的时候是以字母开头

    • 在汇编中,数据不能以字母开头,所以要在前面加0

      回顾

  • ds:[bx]

  • loop&cx
  • degub -g&-p
  • mov ax,[0]:表示ds:0处的数据放入al中。但是在汇编元程序中,指令mov ax,[0]被编译器当做指令mov ax,0处理。

    1. assume cs:codesg
    2. codesg segment
    3. tong:
    4. mov ax,1000H
    5. mov ds,ax
    6. mov ax,11
    7. mov [0],ax
    8. mov ax,22
    9. mov [1],ax
    10. xor ax,ax
    11. mov ax,[0]
    12. xor ax,ax
    13. mov ax,[1]
    14. mov ax,4c00H
    15. int 21H
    16. codesg ends
    17. end tong

    loop和[bx]的联合应用

  • 计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中。

    • 数据单元是8位的,不能加到16为的寄存器中。
    • 与dx结合,loop循环
    • 类型的匹配和结果的不超界

      1. assume cs:codesg
      2. codesg segment
      3. tong:
      4. mov ax,0ffffH
      5. mov ds,ax
      6. mov cx,0bH
      7. xor dx,dx
      8. xor bx,bx
      9. s:mov al,[bx]
      10. mov ah,0
      11. add dx,ax
      12. inc bx
      13. loop s
      14. mov ax,4c00H
      15. int 21H
      16. codesg ends
      17. end tong
  • 将ffff:0~ffff:b的数值复制到0:200~0:20b中

    • 可以将0:200~0:20b用0020:0~0020:b表示

      1. assume cs:codesg
      2. codesg segment
      3. tong:
      4. mov cx,06H
      5. mov bx,0h
      6. s:mov ax,0ffffh
      7. mov ds,ax
      8. mov dx,[bx]
      9. mov ax,0020h
      10. mov ds,ax
      11. mov [bx],dx
      12. add bx,2
      13. loop s
      14. mov ax,4c00H
      15. int 21H
      16. codesg ends
      17. end tong
    • 上面方法换数据段地址,效率不高。可以使用两个数据寄存器。

      1. assume cs:codesg
      2. codesg segment
      3. tong:
      4. mov cx,0bh
      5. mov ax,0ffffh
      6. mov ds,ax
      7. mov ax,0020h
      8. mov es,ax
      9. xor bx,bx
      10. s: mov al,ds:[bx]
      11. mov es:[bx],al
      12. inc bx
      13. loop s
      14. mov ax,4c00H
      15. int 21H
      16. codesg ends
      17. end tong

      就是秀~~~