and 和or 命令
按位计算,举个例子
- mov al,01100011B
mov al,00111011B
执行结果:al=00100011B
对应位取 and 运算,有一个为 0 结果就是 0 ,
简单说就是把对象中相应位的设为 0 ,其他位不变 - mov al,01100011B
or al,00111011B
执行结果为:al=01111011B
对应位取 or 运算,有一个为 1 结果就是 1 ,
简单说就是把对象中相应位的设为 1 ,其他位不变
数据定义
前面提到,定义字型数据 dw,这里整理几种数据定义类型
-
db定义字节类型变量,一个字节数据占1个字节单元,
读完一个,偏移量加1 -
dw定义字类型变量,一个字数据占2个字节单元,
读完一个,偏移量加2 -
dd定义双字类型d量,一个双字数据占4个字节单元,
读完一个,偏移量加4
都可以定义字符串,常用的db字节类型变量,原因有两点:
- 非字型会涉及到多个字节单位,转存到内存会出现顺序颠倒的情况
assume cs:codesg
codesg segment
dw '89','10'
dd 'as','se'
codesg ends
end
dw dd定义两字符串,图中第三列ascll码可见,“89”“10”“as”“se”都倒序
- 第二原因是 dw dd在不同编译器规则格式不同
定位内存地址
两个寄存器 SI DI
具有可BX同等作用,配合DS使用寻址
不能分成两个八位寄存器使用
不同寻址方式
- [adress]
- [bx]
- [bx+idata](或者 idata[bx] 类似于高级语言中的数组处理)
- [bx+si],[bx+di]
- [bx+si+idata],[bx+di+idata]
实例
将datasg段中每个单词改成大写
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'ibm '
db 'dec '
db 'ass '
db 'emb '
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends ;栈道处理两次循环的CX
codesg segment
start:
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0 ;bx控制列
mov cx,4
s0: ;列循环
push cx
mov si,0 ;si控制行
mov cx,3
s: ;行循环
mov al,[bx+si]
and al,11011111B
mov [bx+si],al
inc si
loop s
add bx,16 ;一行16字节
pop cx
loop s0
mov ax,4c00H
int 21H
codesg ends
end start