1.and or 指令
and逻辑与:同真为真
可以将操作对象的某一位设置为0 :
比如第六位:则and al,10111111B
or或运算:同假为假
可以将操作对象的某一位设置为1 :
比如第六位:则and al,01000000B
ASCII码中大小写转换:相差32为2的5次方。字节位置在第5位不同
可以利用上面的运算可以轻松的转换大小写
2.[bx+idata]:对偏移地址进行偏移操作
[bx+idata]=[idata+bx]=idata[bx]=[bx].idata
用[bx+idata]的方式进行数组的处理
可以用[0+bx]和[5+bx]的方式在同一个循环中定位两个字符串的第一个字符
处理数组:
c语言定位方式:a[i]
汇编语言定位方式:0[bx]
3.SI和DI
SI和DI和bx功能相近,只是不能分成两个8位寄存器来使用
也可以使用[si/di+idata]
常用ds:si指向复制的原始字符串
常用ds:di指向复制的目的空间
每次复制两个字节,因为si和di不能拆成两个字节
更灵活的方式:
[bx+si]和[bx+di]
偏移地址:(bx)+(si)
mov ax,[bx+si] = mov ax,[bx][si]
(ax)=((ds)*16+(bx)+(si))
[bx+si+idata]和[bx+di+idata]
双层循环:
start: mov cx,4
s0: mov si,0
mov cx,3
s: add al,110111111b
loop:s
add ah,001000000b
loop:s0
mov ax,4c00h
int 21h
双层循环时,内部的指数器覆盖了外层循环,会导致内存结束后,外层编程FFFF
需要每次先保存外层循环
s0:mov dx,cx
s:...
mov cx,dx
loop s0
但是寄存器又很可能被用到,所以需要定义个dw来保存cx的值
data segment
dw 0
data ends
s0:ds:[40H],cx
s:
...
loop s
mov cs,ds:[40H]
loop s0
但是有很麻烦,可以采用vc栈的做法(这个非常重要)
定义栈空间:
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg segment
s0:push cx
...
s:
...
loop s
pop cx
loop s0