1. 按位与/或指令:
1) and指令表示按位与,or指令表示按位或;
2) 两条指令的参数完全相同,都是将第一个参数和第二个参数进行按位运算,并将结果保存在第一个参数中;
3) 两个操作数的类型和前面讲过的mov指令差不多,并且这里先不提两个操作数都是内存单元的情况;
4) 操作数中不能有段寄存器,其余寄存器可以随便用,只要出现段寄存器就会报错!
5) 一般用途就是利用and将某些位置0,利用or将某些位置1;
2. 大小写转换问题:
1) 大小写字母之间的关系就是小写字母的ASCII码要比相应的大写字母要大20H;
2) 从二进制位上来看,所有小写字母的ASCII码的第三高位恒为1,而大写字母恒为0;
3) 因此可以通过按位与或置0置1的方式来转换大小写;
4) 示例:
assume cs:codesg, ds:datasg
datasg segment
db 'abcdefg'
db 'HIJKLMN'
datasg ends
codesg segment
start:
mov ax, datasg
mov ds, ax
mov bx, 0
mov al, 11011111B
mov cx, 7
lp1:
and [bx], al
inc bx
loop lp1
mov al, 00100000B
mov cx, 7
lp2:
or [bx], al
inc bx
loop lp2
mov ax, 4C00H
int 21H
codesg ends
end start
运行结果:
3. 乘法指令mul:
1) mul有两种类型,一种是两个8位相乘得到一个16位的结果,另一种是两个16位相乘得到一个32位的结果;
2) 双8位相乘:一个乘数默认放在al中,另一个乘数可以放在任意一个8位寄存器或者内存中,结果默认放在ax中;
3) 双16位相乘:一个乘数默认放在ax中,另一个乘数可以放在任意一个16位寄存器或者内存中,结果的高16位默认放在dx中,低16位默认放在ax中;
4) 使用格式:
; 8-bit mul 8-bit
mov al, XXX
mov 8-bit-register/memory, XXX
mul 8-bit-register/memory
; -> ax
; 16-bit mul 16-bit
mov ax, XXX
mov 16-bit-register/memory, XXX
mul 16-bit-register/memory
; -> [dx:ax] 5) 示例:100 × 10和100 × 10000:
assume cs:code
code segment
dd 0
start:
mov al, 100
mov ah, 10
mul ah
mov ax, 100
mov dx, 10000
mul dx
mov word ptr cs:[0], ax
mov word ptr cs:[2], dx
mov ax, 4C00H
int 21H
code ends
end start运行结果:
*1. ax -> 03E8H
*2. 将结果保存在了代码段开头定义的数据区中,结果是000F4240H
4. 除法指令div:
1) 可以把div看做是mul的逆运算,因此div也有两种类型,分别对应着mul的两种类型;
2) 对应于字节型的mul,div的运行方式是,将被除数放在ax(mul的结果),除数放在8位寄存器或内存中,商默认存放在al中(mul的第一个默认乘数),而余数放在ah中;
3) 对应于字型的mul,被除数的低位放在ax中高位放在dx中(mul的结果),除数放在16位寄存器或内存中,商默认放在ax中(mul的第一个默认乘数),而余数放在dx中;
4) div使用方法,先对数据范围进行估计,然后执行上述步骤(即准备被除数和除数),最后直接执行"div 除数"指令即可,结果就保存在相应的寄存器中了;
5) 实例:1001 / 100和100001 / 100:
assume cs:code
code segment
mov ax, 1001
mov bl, 100
div bl
mov ax, 86A1H
mov dx, 1H
mov bx, 100
div bx
mov ax, 4C00H
int 21H
code ends
end运行结果:
*1. 商是0AH,余数是1H
*2. 商是3E8H,余数是1H
本文介绍了Intel汇编语言中MASM的与或操作,包括and和or指令的使用,以及如何通过它们进行大小写转换。接着详细讲解了乘法指令mul的两种类型和除法指令div的运用,包括操作数的放置和结果的存储。通过实例展示了乘除法的执行过程和结果。
77

被折叠的 条评论
为什么被折叠?



