Chinaunix首页 | 论坛 | 博客
  • 博客访问: 512130
  • 博文数量: 161
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1947
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-25 01:20
文章分类

全部博文(161)

文章存档

2011年(44)

2010年(47)

2009年(48)

2008年(22)

我的朋友

分类:

2009-08-28 23:01:36

         寄存器访问
在cpu中 ,16位寄存器存储一个字,
在内存中,内存单元是字节单元
内存中0    1    2    3
      20h 4eh  12h  00h
cpu中16位,子,高8低8
20000(4e20h)内存中如:用0表示地址起始,即低8位,1位高8位
表示为:0地址字单元
字单元,字型数据16位的内存单元,即两个
地址连续的内存单元组成
作业
8bits
16bits
2个
1个半个

DS 和address
ds 存放要访问的数据的段地址
[...] :表示一个内存单元,[address]:表示偏移地址为address的内存单元
cpu不支持将内存地址直接写入段寄存器
需要用一般的寄存器做中转
mov bx, 1000h
mov ds, bx
mov al, [0]  //完成1000h:0内存的数据到al的传送
mov add sub
####################################
mov 寄存器 数据
mov 寄存器 寄存器
mov 寄存器 内存单元
mov 内存单元 寄存器
mov 段寄存器 寄存器
mov 寄存器 段寄存器
mov 段寄存器 内存单元
add sub指令同mov一样,都有两个操作
#######################################
数据段
我们可以将一组长度为N<=64KB,地址连续,起始地址为16的整数倍数的内存单元当作专门存储数据的内存
空间来存放数据
如何访问
用ds来存放数据段的段地址,
将123B0H~123BAH内存单元定义为数据段
累加这个数据段的前3个单元的数据
mov ax,123Bh
mov ds, ax  // 初始化ds段寄存器
mov al, 0   //初始化al =0
add al ,[0] //进行计算
add al ,[1]
add al ,[2]
////////////////////////////
小总结
cs:ip当前cpu要执行的指针
ds:[]  可以另cpu转去读数据段
作业
00b8h
2000h
2000h
00b8h
6e20h
6edbh
a1d8h
0000h
0000h
0000h
0000h
0000h
2:
mov ax, 6622h           cs:ip=2000:0003 ds=1000h ax=6622h bx=0
jmp 0ff0:0100           cs:ip=0ff0:0100 ds=1000h ax=6622h bx=0
     mov ax,2000h       cs:ip=0ff0:0103 ds=1000h ax=2000h bx=0
     mov ds,ax          cs:ip=0ff0:0105 ds=2000h ax=2000h bx=0
     mov ax,[0008]      cs:ip=0ff0:0108 ds=2000h ax=c189h bx=0
     mov ax,[0002]      cs:ip=2000:0008 ds=2000h ax=ea66h bx=0
....
mov bx,ax               cs:ip=2000:000a ds=2000h ax=ea66h bx=ea66h      
 
在内存党员中放的是能被cpu翻译执行的认为是代码,代码也可以被当作数据访问

初始化栈顶
mov ax, 1000h
mov ss , ax
mov sp, 000h
是一种具有特殊的访问方式的存储空间
特殊在于"最后进入这个空间的数据,最先出去lifo  last in first out
push pop
10000h -1000f
栈的初始化:指针底部
mov as, 2266h   
1000e=23
1000f=01 high,,指向1000e
cpu 如何知道栈的位置,,cpu如何知道栈顶,用相应的寄存器来存放栈顶的地址
段寄存器ss  栈顶的段地址
寄存器sp   栈顶的偏移地址
任意时刻 ss:sp指向栈顶元素
step push ax
两步
sp=sp-2 改变栈顶位置,
将ax内容送人ss:sp指向的内存单元
栈空时
将单元的偏移地址为栈底部的字单元的偏移地址+2
pop
将ss:sp数据送出
sp=sp+2
栈顶超界问题
由于8086cpu只知道栈顶在何处(ss:sp),而不知道读者安排的栈空间有多大,cpu只知道当前执行的质量在何处,而
不知道读者要执行的指令有多少.
工作原来:它只考虑当前的情况,当前的栈顶在何处,当前要执行的指令是哪一条
用栈来暂存以后需要恢复的寄存器内容时,寄存器出栈的顺序要和入栈的顺序相反

栈段
我们将10010h--1001fh这段16B的内存当作栈来用!这段空间就可以称为一个栈段,段地址为1000h,大小16B

作业
mov ax, 2000h
mov ss ,ax
mov sp ,0010h
mov ax, 2000h
mov ss ,ax
mov sp ,0000h

用机器指令和汇编指令编程
段寄存器
cs   cs:ip
ds   一般mov ax, [0] 等一般都默认段地址ds中
ss   ss:sp
es
debug的t命令在执行修改寄存器ss的指令时,下一条指令夜紧接这被执行
作业
20010
阅读(1074) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-06-05 02:22:04

大连法律咨询在线 http://www.fabowang.com 大连律师在线咨询 http://www.fabowang.com 大连法律顾问网 http://www.fabowang.com 大连律师咨询 http://www.fabowang.com