. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  汇编一到九章笔记(概念  [待解决] 回复[ 3次 ]   点击[ 911次 ]  
kyolxs
[帖 主]   [ 发表时间:2010-07-28 09:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-09 15:55
cpu cenrtal procossing unit 中央处理器 

寄存器:cpu中可以存储数据的器件 
存储器=多个存储单元 
每个存储单元=1字节 即 1 byte 

cpu要进行数据的读写必须和外部器件进行下面三类信息的互换 
1.存储单元的地址(地址信息)----地址总线 
2.器件的选择,读或写的命令(控制信息)----控制总线 
3.读或写的数据(数据信息)----数据总线 

一个cpu有N根地址线,则可以说这个cpu的地址总线宽度为N 
这样的cpu 最多可寻找2的N次方个内存单元 

8086cpu的数据总线宽度为16 
RAM   随机存储器 
ROM   只读存储器 

典型cpu由运算器,控制器,寄存器组成 

运算器进行信息处理 
寄存器进行信息存储 
控制器控制各种器件进行工作 

8086所有寄存器都是16位  即2 byte 

通用寄存器:  ax,bx,cx,dx 

在写一条汇编指令或一个寄存器的名称时不区分大小写 


运算器一次最多可处理16位数据 
寄存器的最大宽度为16位 
寄存器和运算器之间的通路为16位 

地址加法器采用物理地址=段地址*16+偏移地址 

一个数据的二进制形式左移N位,相当于该数据乘以2^n 
一个x进制的数据左移1位,相当于乘以x 

结论:偏移地址16位。。变化范围为0--ffffh 
仅用偏移地址来寻址最多可寻 64 kb 个内存单元 

8086有四个段寄存器 
cs,ds,ss,es 

cs,ip是8086cpu中两个最关键的寄存器 
cs为代码段寄存器 
ip为指令指针寄存器 


8086的工作过程 

1。从cs:ip指向的内存单元读取指令 
读取的指令进入指令缓冲器 
2.ip=ip+所读指令的长度,从而指向下一条指令 
3.执行指令。回到(1)重复 


jmp 段地址,偏移地址 
功能: 用指令中给出的段地址修改 cs 
      偏移地址修改 ip 

jmp  某一合法寄存器 
功能:用寄存器中的值修改 ip 
      jmp ax  相当于 mov ip,ax 


将起始地址为N的字单元简称为N地址字单元 

ds 寄存器。通常用来存放要访问数据的段地址 

mov 寄存器名,内存单元地址 

用mov指令访问内存单元,可以在movr指令中只给出单元的偏移地址,此时,段地址默认在 ds 寄存器 

栈是一种具有特殊的访问方式的存储空间 
最后进的最先出 
栈的操作规则: LIFO  后进先出 

push 入栈  pop 出栈 
push ax 
表示将寄存器ax中的数据送入栈中 
pop ax 
表示从栈顶取出数据送往 ax 

出栈和入栈都是以字为单位进行的 

段寄存器 SS 和寄存器 SP 
栈顶的段地址存放在 SS 中 
偏移地址存放在SP中 
任意时刻,ss:sp指向栈顶元素 

mov ax,1000h 
mov ds,ax 
push [0] ;将1000:0处的字压入栈中 
pop [2]  ;出栈,出栈的数据在 1000:2处 

不能直接向段寄存器送入数据 

执行 push 时 
先改变 sp 
后向 ss:sp 处传送 

执行pop时 
先读取 ss:sp处的数据 
后改变sp 

在ss:sp中存放栈顶元素的段地址和偏移地址 

目标文件  .obj 
列表文件  .lst 
交叉引用文件:  .crf 

编辑器  Edit 
编绎器  masm 
连接器  link 
调试工具 debug 


ds=129e.则 psp 的地址为 129e:0 
程序的地址为 12ae:0 
即 129e+10:0 

要完整描述一个内存单元,需要两种信息 
1.内存单元的地址 
2.内存单元的长度(类型) 

【bx]同样表示一个内存单元,偏移地址在bx中 

()表示一个寄存器或一个内存单元中的内容 

()中的元素可以有3种类型 
1.寄存器名 
2.段寄存器 
3.内存单元的物理地址(一个20位的数据) 

cpu执行loop指令的时候 
1.(cx)=(cx)-1 
2.判断cx中的值,不为零则转至标号处执行程序。 


1.在cx中存放循环次数 
2.loop指令中的标号所标识地址要写在前面 
3.要循环执行的程序段,要写在标号和loop指令中间 

mov cx,循环次数 
s:循环执行的程序段 
loop s 

在汇编语言中,数据不能以字母开头 

这些出现在访问内存单元的指令中 
用于显式地指明内存单元的段地址的 
“ds" "cs" "ss" "es" 
在汇编语言中称为段前缀 

dos 和其他合法程序一般都不会使用 
0:200  ---- 0:2ff 的256个字节的空间 

g命令 
表示执行程序到当前代码段(段地址在CS中 
也就是说 将使 debug 从当前的 cs:ip指向的指令执行 
一直到 (ip)=0012h 为止 

单任务系统中。可执行文件的程序执行过程如下: 
1.由其它程序(debug,command或其它程序)将可执行文件中的程序加载入内存 
2.设置cs:ip指向程序的第一条要执行的指令(即程序的入口),从而使程序得以运行 
3.程序运行结束后,返回加载者 

一般情况下。 
用来放数据的段我们将其命名为 data 
用来放代码的段我们将其命名为 code 
用来作栈空间的段命名为 stack 

在程序中,段名就相当于一个标号,它代表了段地址 

一个字母,不管它原来是大写还是小写,将它的第5位置0,它就必将变成大写字母,反之。小写 

”A“的ASCII码是 41H 
”a"R ascii码是 61h 

对于push ax 的功能,可以这样来描述 
(sp)=(sp)-2 
((ss)*16+(sp))=(ax) 

对于pop ax 的功能,可以这样来描述 
(ax)=((ss)*16+(sp)) 
(sp)=(sp)+2 

标号代表一个地址,如:标号 s 
它实际上标识了一个地址 
这个地址有一条指令  add ax,ax 

end 除了通知编译器程序结束外 
还可能通知编绎器程序的入口在什么地方 

我们可以看到程序加载到内存中后,所占内存空间的前16个单元存放在源程序用 “dw 定义的数据” 

在程序中,段名就相当一个标号,它代表了段地址 
所以指令  mov ax,data 
         是将名称为 “data"的段的段地址送入 ax 

8086 cpu 不允许将一个数值直接送入段寄存器 

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

si di 不能够分成两个8位寄存器来使用 

一般来说。在需要暂存数据的时候,我们都应该使用栈 

reg 表示一个寄存器 
包含 ax bx cx dx  
    ah al bh bl 
    ch cl dh dl sp bp si di 

sreg 表示一个段寄存器 
     ds ss cs es  

在8086 cpu 中。只有以下4个寄存器可以用在 []中来进行内存地址的寻址 

bx si bp di 
这四个寄存器可以单个出现 
或只能以四种组合出现 
或只能以4 种组合出现 
bx和si bx和di bp和si bp和di 

只要在[]中使用寄存器bp 
而指令中没有显性地给出段地址 
段地址就默认在 ss 中 

汇编语言用3 个概念来表达数据的位置 
1.立即数 
2.寄存器 
3.段地址 sa 和偏移地址 ea 

当数据存放在内存中的时候,我们可以用多种方式来给定这个内存的偏移地址 
这种定位内存单元的方法 
被称为寻址方式 

在没有寄存器参与的内存单元访问指令中 
用 word ptr 或 byte ptr 显性指明要访问的内存空间 

mov word ptr ds:[0] 
mov byte ptr ds:[0] 

al 存储除法操作的商 
ah 存储除法操作的余数 

ax 存储除尘操作的商 
dx 存储除法操作的余数 

db 定义字节型数据 
dw 定义字型数据 
dd 定义双字型数据  double word 

用 debug 命令 

R 命令查看,改变CPU寄存器的内容 
D 命令查看内存中的内容 
E 命令改写内存中的内容 
U 命令将内存中的机器指令翻译成汇编指令 
T 命令执行一条机器指令 
A 命令以汇编指令的格式在内存中写入一条机器指令 

任意时刻,ss:sp指向栈顶元素 

用栈来暂存以后需要恢复的寄存器中的内容时 
出栈的顺序与入栈的顺序相反 

assume 这条伪指令的含义为“假设” 

assume 将有特定用途的段和相关的段寄存器关联起来即可 


jmb 指令要给出两种信息 
1.转移的目的地址 
2.转移的距离(段间转移,段内短转移,段内近转移) 

jmp short 标号(转到标号处执行指令 

cpu 在执行 jmp 指令时并不需要转移的目的地址。 

负数补码-----负数 
取反+1    变符号 

负数----负数补码 
绝对值(变符号)   取反加1 

bx si di bp 
bx+si   bx+di  bp+si   bp+di 

bp 段地址默认在 ss 

汇编语言用 3 个概念来表达数据的位置 
1.立即数(idata) 
2.寄存器 
3.段地址(SA)和偏移地址(EA) 

指令是字操作还是字节操作,汇编语言用以下方法处理 
1.通过寄存器名指明要处理数据的尺寸 
2.在没有寄存器的情况下,用操作符 X ptr 指明内存单元的长度 
  x 在汇编指令中可以为 word ptr 
3.其它。如push 默认字单元 

用 bx 定位整个结构体 
用 idata 定位结构体中的某一个数据 
用 si 定位数组项中的每个元素 

8086的转移指令分为以下几类 

无条件转移指令 
条件转移指令 
循环指令 
过程 
中断 

只修改 ip 称为段内转移。如: jmp ax 
其中短转移范围:  -128到127 
    近转移范围: -32768到32767 

同时修改CS和IP时,称为段间转移 
如: jmp 1000:0 

cpu 在执行 jmp 指令时是不需要转移的目的地址 
jmp short 标号的功能是 
  (IP)=(IP)+8位位移 
jmp net ptr 标号的功能是 
(IP)=(IP)+16位位移 

转移的目的地址在指令中的 jmp 指令 
jmp for ptr 标号 
是段间转移,又称为远转移 

“0B01 BD 0B " 
是目的地址在指令中的存储顺序 
高地址 ”BD 0B "是转移地址的段地址 0BBD h 
低地址 " 0b 01 "是转移地址的转移地址 010B h 

转移地址在内存中的 jmp 指令有两种格式 
1.jmp word ptr 内存单元地址(段内转移) 
  功能: 从内存单元地址处开始存放一个字 
         是转移的目的偏移地址 
         jmp word ptr ds:[0] 

2.jmp dword ptr 内存单元地址(段内转移) 
  功能: 从内存单元地址处开始存放着两个字 
         高地址处的字是转移的目的的段地址 
         低地址是转移的目的偏移地址 

jcxz 指令为有条件转移指令 
        (如果(cx)=0,转移到标号处执行 
段内短转移   -128到127 

操作 当(cx)=0 时 
     (ip)=(ip)+8位位移 
     当 (cx)!=0 时 
     什么也不做(程序向下执行) 

jcxz 标号 的功能相当于 
     if ((cx)==0)  jmp short 标号 



将 s 处的指令复制到 s0处 
就是将 cs:offset s 处的数据复制到 cs:offset s0 处 
nop 的机器码占一个字节 

在一般汇编指令中,汇编指令的 idata (立即数) 
不论它是表示一个数据还内存单元的偏移地址 
都会在对应的机器指令中出现


后记:
这阵子学习汇编整理出来的一些概念,特来和各位分享。敲打过程中出错地方,还望各位指出!
masmaster
[第1楼]   [ 回复时间:2010-07-28 09:20 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
学习~~~
lulua00
[第2楼]   [ 回复时间:2010-08-30 11:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-08-29 11:35
学习
kyolxs
[第3楼]   [ 回复时间:2011-01-02 16:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-03-09 15:55
学习
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved