汇编学习笔记(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=1000h1.[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
相关文章推荐
- 寻址方式——汇编学习笔记(三)
- PC寻址方式遗留问题——A20地址线
- 8086 寻址方式(一)CPU和主存中的寻址方式
- ARM汇编之寻址方式
- ARM学习笔记(八)--寻址方式
- 寻址方式
- ARM寻址方式
- 关于VB中数据的存储格式和寻址方式
- 寻址方式
- 小结:8.4 8086汇编 寻址方式小结
- 七种寻址方式(立即寻址、寄存器寻址)
- 51系列单片机的寻址方式
- ARM汇编编程基础(二) -- 基本寻址方式与基本指令
- 8086 CPU的七种基本的寻址方式【备查】
- 七种寻址方式(立即寻址、寄存器寻址)
- Linux汇编教程04:寻址方式
- arm9的操作模式,寄存器,寻址方式
- 80X86寻址方式
- 汇编语言学习---寻址方式在结构化数据访问中的应用
- 微机接口寻址方式分类