您的位置:首页 > 其它

汇编学习笔记(4)寻址方式

2013-12-17 22:31 169 查看

前言

本文是《汇编语言》的学习笔记,对应书中第七章内容,灵活的寻址方式。

这一章节主要通过例题的形式介绍汇编中访问内存的多种方式,新介绍了and和or命令,si,di寄存器。

and

and命令是逻辑与命令,按二进制位进行与运算。与运算就是q与q的合取式记为p^q,p和q只要有一个为假,p^q就为假,当且仅当q和q都为真时,p^q才为真。用二进制表示,当且仅当p和q都为0时,p^q才为0,所以


mov al,01100000b

and al,00110000b


结果等于00100000b.

or

or命令是逻辑或命令,按二进制位进行或运算。或运算就是q或q的析取式记为pVq,p或q只要有一个为真,pVq就为真,当且仅当q和q都为假时,pVq才为假。用二进制表示,当且仅当p和q都为1时,pVq才为1,所以


mov al,01100000b

or al,00110000b


结果等于01110000b.

si和di

si和di是8086CPU中和bx功能相近的寄存器,不同的是si和di不能拆分为两个8位寄存器,即没有sh,sl,dh,dl,si和di多和bx搭配表示地址。

内存地址的表示方式

程序的设计大部分是对数据的处理,数据一般存储在内存当中,所以对内存单元的寻址能力尤其重要。数据段的段地址一般保存在寄存器ds中,故在偏移地址的表示方面可以有多种方式,假设ds=1000h

1.[idata],设idata=10h,则内存单元地址为ds:[10]=10010h

2.[bx],设(bx)=10h,则内存单元地址为ds:[bx]=10010h

3.[bx+idata],idata[bx],[bx].idata,设(bx)=10h,idata=10h,则内存单元地址为ds:[bx+idata]=10020h

4.[bx+si],[bx+di],[bx][si],[bx][di],设(bx)=10h,(si)=10h,则内存单元地址为ds:[bx][si]=10020h

5.[bx+si+idata],[bx+di+idata],idata[bx][si],idata[bx][di],设(bx)=10h,(si)=10h,idata=10h,则内存单元地址为ds:idata[bx][si]=10030h

几个例子

将小写字符改为大写,大写字符改为小写

;将第一个字符串变为大写,第二个字符串变为小写

assume cs:code,ds:data

data segment
db 'unix'
db 'FORK'
data ends

code segment
start:  mov ax,data
mov ds,ax
mov bx,0
mov cx,4
s:      mov al,0[bx];等同[bx+0]
and al,11011111b;与运算,第五位置为0,大写
mov 0[bx],al
mov al,4[bx];偏移地址为bx+4,内存地址为(ds)*16+(bx)+4
or al,00100000b;或运算,第五位置为1,小写
mov 4[bx],al
inc bx
loop s

mov ax,4c00h
int 21h

code ends

end start




大家可以看到上面的例子中,偏移地址的表示方式0[bx],5[bx]和C语言中的数组表示array[0],array[5]非常相像,C语言的数组可以理解为对数组首元素的偏移量。

将字符串的首字母大写

;将字符串首字母大写

assume cs:code,ds:data

data segment
db '1.file          '
db '2.folder        '
db '3.path          '
data ends

code segment
start:  mov ax,data
mov ds,ax
mov bx,0
mov si,2
mov cx,3
s:      mov al,[bx][si]
and al,11011111b
mov [bx][si],al
add bx,16
loop s

mov ax,4c00h
int 21h

code ends

end start




将每个字符串改为大写字母

;将字符串改为大写

assume cs:code,ds:data,ss:stack

data segment
db 'file            '
db 'name            '
db 'path            '
data ends

stack segment
dw 0,0,0,0,0,0,0,0
stack ends

code segment
start:  mov ax,stack
mov ss,ax
mov sp,16;指向栈顶
mov ax,data
mov ds,ax
mov bx,0
mov cx,3
s:      push cx
mov si,0

mov cx,4
s0:     mov al,[bx][si]
and al,11011111b
mov [bx][si],al
inc si
loop s0

pop cx
add bx,16
loop s

mov ax,4c00h
int 21h

code ends

end start


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: