image.png
    一、[bx]:
    说明:
    1、[bx]和[0]有些类似,[0]表示内存单元,他的偏移地址是0。[bx]表示一个内存单元,他的偏移地址在bx中
    在编译器中:
    mov ax,[0] 把0给寄存器ax
    mov ax,[bx] 把0对应的偏移地址该寄存器ax
    在Debug中:
    mov ax,[0] 把 ds:0 处的数据送入寄存器al
    2、描述性符号“()”:
    ①、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
    ⑦、add ax,bx的功能,可描述为:(ax) = (ax) + (bx)
    ⑧、push ax的功能,可描述为:(sp) = (sp) - 2、((ss)16 + (sp)) = (ax)
    ⑨、pop ax的功能,可描述为:(ax) = ((ss)
    16 + (sp))、(sp) = (sp) + 2
    3、约定符号idata:表示常量
    指令中,在“[…]”里用一个常量
    表示内存单元的偏移地址,以后,用idata表示常量
    ①、mov ax,[idata] 就代表:mov ax,[1]、mov ax,[2]、mov ax,[3] 等
    ②、mov bx,idata 就代表:mov bx,1、mov bx,2、mov bx,3 等
    ③、mov ds,idata 就代表:mov ds,1、mov ds,2、mov ds,2 等,他们都是非法指令
    4、mov ax,[bx]:
    bx中的存放的数据作为一个偏移地址EA、段地址SA默认在ds中,将SA:EA处的数据送入ax中,即:(ax) = ((ds)16 + (bx))
    5、mov [bx],ax:
    bx中的存放的数据作为一个偏移地址EA、段地址SA默认在ds中,将ax处的数据送入SA:EA中,即:((ds)
    16 + (bx)) = (ax)

    二、loop:循环的意识
    语法:loop 标号
    过程:CPU执行loop指令的时候,要进行两步操作:
    ①、(cx) = (cx) - 1;
    ②、判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行

    1. assume cs:YYY
    2. YYY segment
    3. start mov ax,2
    4. mov cx,11
    5. s:add ax,ax
    6. loop s
    7. mov ax,4c00H
    8. int 21H
    9. YYY ends
    10. end

    说明:
    ①、标号:
    在汇编语言中,标号代表一个地址,上程序中有一个标号s,它实际上标识了一个地址,这个地址处有一条指令:add ax,ax
    ②、loop s:
    CPU执行loop指令的时候,要进行两步操作:
    a、(cx) = (cx) - 1;
    b、判断 cx 中的值,不为0则转至标号 s 所标识的地址处执行(add ax,ax),如果为0则向下执行下一条指令(mov ax,4c00H)
    ③、mov cx,11:
    在 cx 中存放循环次数
    注:在汇编源程序中,数据不能以字母开头。例如:mov ax,0ffffH,不能写成mov ax,ffffH

    三、段前缀:
    mov ax,cs:[0] cs是段前缀
    mov bx,es:[0] es是段前缀

    四、一段安全的空间:
    在一般的PC机中,DOS方式下DOS和其他合法的程序一般不会使用0:200~0:2FF的256个字节的空间,所以,我们使用这段空间是安全的