学习笔记 -- 定位内存地址

and和or指令

0代表假,1代表真。

and指令

逻辑与指令,按位进行与运算。有假则假。

0&0=0 , 0&1=0 , 1&1=1

通过and指令可将操作对象相应位设为0,其他位不变。

and al,11011111b   将al的第5位设为0

or指令

逻辑或指令,按位进行或运算。有真则真。

0|0=0 , 0|1=1 , 1|1=1

通过or指令可将操作对象的相应为设为1,其他位不变。

or al,00100000b   将al的第5位设为1

ASCII码

文本编辑过程中,包含着按照ASCII编码规则进行的编码和解码。按下键盘的a键,计算机用ASCII码的规则对按键的信息进行编码,将其转化位61H存储在内存的指定空间。

字符形式给出的数据

在汇编程序中,用’……'的方式指明数据是以字符形式给出的,编译器把它们转化为相应的ASCII码。

大小写转换

同一个字母的大小写ASCII码的十六进制相差20。A的ASCII码为01000001,a的ASCII码为01100001。大小写的区别就在于第五位,改变第五位的数字就可以转换大小写。

assume cs:code,ds:data
data segment
	db 'MuSic'
data ends
code segment
	start:	mov ax,data
			mov ds,ax
			mov bx,0
			mov cx,5
	x:		mov al,[bx]
			and al,11011111b ;将第5位二进制码改为
			mov [bx],al		 ;0
			inc bx
			loop x
			mov ax,4c00h
			int 21h
code ends
end start

[bx+idata]

**[bx]可以用来指明一个内存单元,还可以用[bx+idata]**表示一个内存单元,它的偏移地址为(bx)+idata。

mov ax,[bx+200]

将一个内存单元中的内容送入ax,这个内存单元的段地址在ds中,偏移地址为bx中的数值加上200。

(ax)=((ds)*16+(bx)+200)

也可以写成

mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200

[bx+idata]的方式处理数组

将’MuSiC’ 'ReMiX’转化为一个大写一个小写。

assume cs:code,ds:data
data segment
	db 'MuSiC'
	db 'ReMiX'
data ends
code segment	
	start:	mov ax,data
			mov ds,ax
			mov bx,0
			mov cx,5
	x:		mov al,[bx] ;第一个字符串中的字符
			and al,11011111b
			mov [bx],al
			mov al,[bx+5] ;第二个字符串中的字符
			or al,00100000b
			mov [bx+5],al
			inc bx
			loop x

			mov ax,4c00h
			int 21h
code ends
end start

SI和DI

sidi是8086CPU中和bx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用。

mov bx,0
mov ax,[bx]

mov si,0
mov ax,[si]

mov di,0
mov ax,[di] ;三组指令功能相同

sidi也能够加上idata。

[bx+si]和[bx+di]

si和di可以用到偏移地址的表示。

[bx+si]和[bx+di]的含义相似。

[bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)。

将一个内存单元的内容送入ax,这个内存单元的长度为2字节,存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中。

(ax)=((ds)*16+(bx)+(si))

也可以用

mov ax,[bx][si]

来表示。

[bx+si+idata]和[bx+si+idata]

[bx+si+idata]和[bx+si+idata]的含义相似。

[bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata。

将一个内存单元的内容送入ax,偏移地址为bx中的数值加上si中的数值再加上idata,段地址在ds中。

(ax)=((ds)*16+(bx)+(si)+idata)

也可以用下面的格式描述

mov ax,[bx+200+si]
mov ax,[200+bx+si]
mov ax,200[bx][si]
mov ax,[bx].200[si]
mov ax,[bx][si].200

不同的寻址方式的灵活应用

几种定位内存地址的方法。

  1. [idata]用一个常量来表示地址,可用于直接定位一个内存单元。
  2. [bx]用一个变量来表示内存地址,可用于间接定位一个内存单元。
  3. [bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元。
  4. [bx+si]用两个变量表示地址。
  5. [bx+si+idata]用两个变量和一个常量表示地址。

当程序需要使用嵌套循环时,用内存单元或栈来保存外层循环的cx值,内存循环结束时,再把数值返回。

assume cs:code,ds:data,ss:stack
data segment
	db 'ibm             '
	db 'dec             '
	db 'dos             '
	db 'vax             '
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,10h
			mov ax,data
			mov ds,ax
			mov bx,0
			mov cx,4
	x0:		push cx   ;定义行,把cx中的4入栈
			mov si,0
			mov cx,3
	x:		mov al,[bx+si] ;定义列的循环
			and al,11011111b
			mov [bx+si],al
			inc si
			loop x

			pop cx  ;4出栈,进行行的循环
			add bx,10h
			loop x0

			mov ax,4c00h
			int 21h
code ends
end start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值