七、更灵活的定位内存地址的方法
1.and和or
and:进行按位置与运算,可用来对相应位置置0
or:进行按位或运算,可用来对相应位置置1
2.关于ASCII、以字符形式给出的数据
在计算机中,采取ASCII编码,将人能理解的信息存入到计算机,再从计算机中取出。
在汇编程序中,字符形式的数据会被编译器转化为相对应的ASCII码。
3.大小写转换的问题
通过对比可以知道,小写字母的ASCII码值比大写字母的大20H。要实现转换,还要能够判断当前字母是大写或小写,但目前所学指令无法对其进行判断。又发现大小写字母ASCII码仅有一位不同,可通过and或or对其进行置1或置0完成转换。
4.[bx+idata]
指令:mov ax,[bx+200]
数学化描述:(ax)=((ds)*16+(bx)+200)
该指令也可以写成其他格式:
mov ax,200[bx]或mov ax,[bx].200
5.用[bx+idata]的方式进行数组的处理
原来用[bx]的方式定位字符串中的字符:
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111b
mov [bx],al
inc bx
loop s
用[bx+idata]的方式简化:
mov bx,0
mov cx,5
s:mov al,[bx]
and al,11011111b
mov [bx],al
mov al,[bx+5]
or al,00100000b
mov [bx+5],al
inc bx
loop s
将两个字符串看作两个数组,他们的起始偏移地址不同,但相对地址的变化是相同的。
6.SI和DI
si和di是和dx功能相近的寄存器,si和di不能够分成两个8位寄存器来使用。
指令:mov ax,[bx+si]
数学化的描述:(ax)=((ds)*16+(bx)+(si))
指令:mov ax,[bx+si+idata]
数学化的描述:(ax)=((ds)*16+(bx)+(si)+idata)
7.不同的寻址方式的灵活运用
遇到二重循环问题的时候,需要使用内存来暂存数据,使用栈是比较方便的做法。
八、数据处理的两个基本问题
0.前言
定义描述性符号:
reg表示寄存器;
sreg表示段寄存器,包括ds、ss、cs、es
1.bx、si、di、bp
a)在8086CPU中,只有这4个寄存器可以用在“[…]”中来进行内存单元的寻址。
b)在[ ]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。
c)只要在[…]中使用寄存器bp,而指令中没有显性地给出段地址, 段地址就默认在ss中。
2.机器指令处理的数据在什么地方
a)绝大部分机器指令都是进行数据处理的指令,大致分为:读取,写入,运算三类;
b)在机器指令这一层来讲,并不关心数据的值是多少,而关心指令执行前一刻,它将要处理的数据所在的位置。指令在执行前,所要处理的数据可以在3个地方:CPU内部、内存、端口。
3.汇编语言中数据位置的表达
a)立即数
b)寄存器
c)段地址和偏移地址
4.寻址方式
当数据存放在内存中的时候,可以用多种方式给定这个内存单元的偏移地址,这种给定内存单元的方法一般被称为寻址方式。
5.指令要处理的数据的长度
1.通过寄存器名要处理的数据的尺寸
如ax,al寄存器,ax是十六位寄存器,al是ax的低八位。
2.通过操作符 X ptr 指明内存单元的长度
如
move word ptr ds:[0],1或
move byte ptr ds:[0],1
3.其他方法
如push指令只执行字操作
6.寻址方式的综合应用
一般来说,可以用[bx+idata+si]的方式访问结构体中的数据,用bx定位整个结构体用idata定位结构体中的某一个数据项,用si来定位数据项中的每个元素。
7.div指令
即除法指令
1.除数(即分子)
有8位和16位两种,在一个寄存器-或内存单元中。
2.被除数(即分母)
默认在AX或AX和DX中,若除数为8位,则被除数位16位,在AX中;若除数为16位,被除数为32位,DX存放高16位,AX放低16位。
3.结果
若除数为8位,AL存储结果,AH存储余数;
若为16位,AX存结果,DX存余数
8.伪指令dd
db用来定义字节型数据
dw用来定义字型数据
dd用来定义double型数据
db 1 ->0X01
dw 1 ->0X0001
dd 1–>0X000001
9.dup
dup是操作符,同db,dd等一样,由编译器识别处理,用来重复数据。比如:
db 3 dup(0):定义了三个字节,值位0;
db 3 dup(0,1,2):定义了九个字节
九、转移指令的原理
1.操作符offset
操作符。取得标号的偏移地址。
2.jmp指令
无条件转移指令,可以修改ip或cs和ip;
jmp指令要给出两种信息:1.转移的目的地址;2.转移的距离
不同的给出地址的方式和不同的转移位置有不同格式的jmp指令
3.依据唯一进行转移的jmp指令
1.CPU在执行jmp指令的时候并不需要目的地址,jmp short 标号 指令对应的机器码中,包含的是转移的位移,这个位移,是相对于当前IP的转移位移。是编译器根据汇编指令中的标号计算出来的。
2.“jmp short 标号”:段内短转移,(ip)=(ip)+8,位移的范围:-128~127
“jmp near ptr 标号”:段内近转移,(ip)=(ip)+16,位移的范围:-32768~32767
4.转移的目的地址在指令中的jmp指令
“jmp ptr far 标号”:段间转移(远转移)
其对应的机械码包含转移的目的地址,高地址的是转移的段地址,低地址的是转移的偏移地址。
5.转移地址在寄存器中、内存中的jmp指令
1.jmp 16位 reg
2.在内存中:
1.jmp word ptr 内存单元地址(段内)
2.jmp dword ptr 内存单元地址(段间):高地址存放目的段地址
例如:mov ax,0123H
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]
执行后 (cs)=0(ip)=0123H
6.jcxz指令
有条件的转移指令,都是短转移
jcxz 标号(如果(cx)=0(即cx 的值为zero),转移到标号处执行,否则向下执行)
7.loop指令
循环指令,都是短转移,对应的机器码中包含转移的位移。
指令格式:loop 标号((cx)=(cx)-1,若(cx)!=0,转移到标号处执行)
8.根据位移进行转移的意义
方便了程序段在内存中的浮动装配,程序在内存中的不同位置都可以正确执行。
编译器会对转移位移进行超界的检测。