• [bx]

      • 编译器和直接在shell里写[0]解析不一致
        • 编译器:mov al,[0] = mov al,0
        • shell:mov al,[0] = mov al, ds:[0]
      • 为了编译器解析的一致性,用[bx]做中间跳板
        • mov bx,0
        • mov ax,[bx]
        • mov al,[bx]
      • 描述内存单元
        • 内存单元的地址
        • 内存单元的长度(类型)
    • loop

      • 描述性符号(X),X的值
        • (ax)=0010H
        • (21000H)=0010H
        • mov ax,[2] = (ax) = (ds)*16+2
      • idata:约定符号,表示常量
      • loop指令

        • (cx) = (cx)-1
        • 跳到标号
          1. assume cs:codesg
          2. codesg segment
          3. start:
          4. mov ax,2
          5. mov cx,11 ;2^12
          6. s:add ax,ax
          7. loop s ;cx-1,判断cx=0时跳出,编译时编译器自动将s改为偏移地址,loop sIP置为偏移地址
          8. mov ax,4c00h ;编译器分析默认10进制,要添加h代表16进制
          9. int 21h
          10. codesg ends
          11. end start
      • 运算时要考虑是否会溢出

      • dx寄存器进行累加:(dx)=(dx)+(ax)
      • ffff:0006单元向ax赋值,令(ah)=0 ,(al)=(fff6h)
      • 在汇编源程序中,数据不能以字母开头!! ```cpp ;ffff:0006单元数x3,结果存储在dx中

    assume cs:codesg codesg segment start: mov ax,0ffffh ;在汇编源程序中,数据不能以字母开头!! mov ds,ax mov bx,6 mov al,[bx] ;8位!! mov ah,0 mov dx,0 mov cx,3 s: add dx,ax loop s

    1. mov ax,4c00h
    2. int 21h

    codesg ends end start

    1. - 计算ffff:0~ffff:b单元中的数据的和,结果存储在dx
    2. - 不能直接用dx算加法:16位寄存器不能直接用来8位加法(类型要匹配)
    3. - 也不能累加到dl中,可能造成进位丢失(结果不能越界)
    4. - 解决方法:
    5. - 方法一:用一个16位寄存器来做中介
    6. - mov al,ds:[bx]
    7. - mov ah,0
    8. - add dx,ax
    9. - add bx,1(inc b x)
    10. - 一段安全的空间
    11. - 0:200h~0:2FFh (256字节)
    12. - 0020:0002F:F
    13. - 用附加段寄存器es辅助ds做段内数据的复制,能节省时间
    14. ```cpp
    15. assume cs:code
    16. code segment
    17. mov ax,0fffh
    18. mov ds,ax
    19. mov ax,0020h
    20. mov es,ax
    21. mov bx,0
    22. mov cx,12
    23. s:mov dl,[bx]
    24. mov es:[bx],dl
    25. inc bx
    26. loop s
    27. mov ax,4c00h
    28. int 21h
    29. code ends
    30. end