汇编语言学习笔记——第七章 定位内存地址

and和or指令

  1. and指令:逻辑与指令,按位进行与计算。
    mov al,01100011B
    and al,00111011B
    
    执行后的结果:
    (al) = 00100011B
    
  2. or指令:逻辑或指令,按位进行或运算。
    mov al,01100011B
    or al,00111011B
    
    执行后结果:
    (al) = 01111011B
    

ASCII码

我们可以在汇编程序中,用'...'的方式指明数据是以字符的形式给出的,编译器将会把它们转化为相对应的ASCII码。

data segment
    db 'unIX'
data ends

程序解析:

db 'unIX'相当于db 75H,6EH,49H,58H,unIX占4*8位,4个字节,2个存储单元。

SI和DI

si和di是8086CPU内和bx功能相近的寄存器,si和di不能分成两个8位寄存器来使用。

mov si,0
mov ax,[si]         ;(ax) = 0
mov ax,[si+123]     ;(ax) = 123

[bx+si+idata]和[bx+di+idata]

mov ax,[bx+si+idata]

含义:将一个字单元的内容送入ax,段地址在ds中,偏移地址为bx中的值加上si中的值再加上idata。
数学化描述:(ax) = ((ds)*16+(bx)+(si)+idata)

该指令的其他常用格式:

mov ax,[bx+200+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200

嵌套循环

把循环次数放到内存中

code segment

st: mov cx,4
s0: mov ds:[40H],cx         ;把外循环的循环次数存进内存中
    ...
    ...

    mov cx,8                ;设置内循环的次数为8
s:  ...
    ...
    loop s                  ;内循环

    mov cx,ds:[40H]         ;把外循环次数从内存中取出
    loop s0                 ;外循环

code ends
end st

把循环次数放到栈中

stacksg segment
    dw 0,0,0,0              ;(开辟足够的内存空间作为栈空间)
stacksg ends 

code segment

st: mov ax,stacksg          ;设置栈顶
    mov ss,ax
    mov sp,8
    ...
    mov cx,4
s0: push cx                 ;把外循环的循环次数压进栈中
    ...
    ...

    mov cx,8                ;设置内循环的次数为8
s:  ...
    ...
    loop s                  ;内循环

    pop cx                  ;把外循环次数从栈中取出
    loop s0                 ;外循环

code ends
end st