若有效地址用SI、DI和BX来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
assume ds:data,cs:code
data segment
db 'unIxabc'
db 'foRKxY'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov cx,7
mov bx,0
s:
mov al,ds:[bx]
or al,00100000b
mov ds:[bx],al
//上三行可以or byte ptr ds:[bx],00100000b代替
inc bx
loop s
mov cx,6
s1:
mov al,ds:[bx]
and al,11011111b
mov ds:[bx],al
//上三行可以and byte ptr ds:[bx],11011111b代替
inc bx
loop s1
mov ax,4c00h
int 21h
code ends
end start
/*将unIxabc大写,foRKxY小写。两个知识点,
1是大写al,11011111b小写or al,00100000b,
2是mov al,ds:[bx] 和 mov ds:[bx],al 可以操作一个字节,
自己一开始写or ds:[bx],00100000b编译时报错operand must have size.
汇编中的PTR有两种作用:
1.type PTR expression
强制把expression当作指定的type来使用
2. [var] PTR type
定义var为指向类型的指针
*/
[bx+idata]:
mov ax,[bx+200]
将长度为2个字节(子单元)的内容送入ax
(ax)=((ds)*16+(bx)+200)
等价写法
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200
assume ds:data,cs:code
data segment
db 'welcome to masm!'
db '................'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov cx,10h
s:mov al,ds:[si]
mov ds:[10h+si],al
inc si
loop s
mov ax,4c00h
int 21h
code ends
end start
/*作用是把'welcome to masm!'复制粘贴到它后面的区域,
书上的代码按字进行操作,cx=8,si每次加2*/
下面的代码使用栈临时保存cx,实现两层遍历,把data的12个小写字母变大写。
assume ds:data,cs:code,ss:stack
data segment
db 'abc.............'
db 'def.............'
db 'ghi.............'
db 'xyz.............'
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,10h
mov ax,data
mov ds,ax
mov cx,4
s:
push cx
mov si,0
mov cx,3
s1:
mov al,ds:[si+bx]
and al,11011111b
mov [si+bx],al
inc si
loop s1
pop cx
add bx,10h
loop s
mov ax,4c00h
int 21h
code ends
end start