and指令
被允许的组合:
AND reg, reg
AND reg, mem
AND reg, imm
AND mem, reg
AND mem, imm
逻辑运算中的按位与运算
还可以实现将寄存器中的某个位设置为0
and al,111111110b
将al
寄存器的中的第0位设置为0
or指令
逻辑或指令
还可以用于将某一位设置为1
[bx+idata]
]
]
]
汇编实现到大写,到小写
assume cs:codesg,ds:datasg
datasg segment
db 'Unix'
db 'YeeP'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,8
s: or byte ptr ds:[bx],20h
add bx,1
loop s
mov ax,4c00h
int 21h
codesg ends
end start
SI和DI
SI(source index)和DI(destination index)是8086CPU
中和bx功能相近的寄存器,但是SI和DI
不能分成两个低位的寄存器,在处理内存中的数据的过程中,只能一次将两个字节放入寄存器中
字符串复制代码
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm '
db '................'
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov cx,8
mov si,0
mov di,16
;不存在内存单元到内存单元的寻址方式
s: mov ax,[si]
mov [di],ax
;si和di寄存器只能一次性操作两个字节,不可以在拆分
add si,2
add di,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
]
计算出[bx+2+si]的值:[]1002H]
对应的是00,然后由于ax为16位寄存器,往后多读一个字节,也就是 06 00
8086采用大端方式,大的地址对应的值放在高位也就是0006H
将每个单词开头设置为大写
assume cs:codesg,ds:datasg
datasg segment
db '1. file '
db '2. edit '
db '3. search '
db '4. view '
db '5. options '
db '6. help '
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov cx,6
mov bx,0
s:
mov al,[bx+3]
and al,0dfh
mov [bx+3],al
;and byte ptr [bx+3],0dfh
add bx,16
loop s
mov ax,4c00h
int 21h
codesg ends
end start
将数据段前四个字符变成大写
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1.display.......'
db '2.brows.........'
db '3.replace.......'
db '4.modify........'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,16
mov cx,4
mov si,0
s0:
mov bx,0
push cx
mov cx,4
s:
and byte ptr [si+bx+2],0dfh
inc bx
loop s
add si,16
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start