① 汇编语言SI、DI、BX、BP、SS、DS分别是什么怎样根据这些求物理地址
1.汇编语言 SI DI BX BP SS DS 是什么
SI: 16位寄存器,源变址寄存器
DI: 16为寄存器,目的变址寄存器
BX: 16位寄存器(可分成2个8位寄存器BH,BL),基址寄存器
BP: 16位寄存器,基址指针寄存器
SS : 16位段寄存器,作用是存放当前堆栈段的段地址,一般和SP连用
DS: 16为段寄存器, 作用是存放当前数据段的段地址
2.怎样根据这些求物理地址
上面的这几个寄存器跟求物理地址谈不上关系.
有个公式: 物理地址 = 基础地址 + 偏移地址 = CS*10H(基础地址)+ IP(偏移地址)
CS: 16位段寄存器,存放当前代码段的段地址
IP: 存放下一条要执行的指令的偏移地址
LZ如有不明白的地方,可追问
② 汇编语言:SI、DI、BX、BP、SS、DS分别是什么怎样根据这些求物理地址
si、di分别是源、目的变址寄存器,bx是数据基址寄存器,bp是栈基址寄存器,SS、DS是段地址寄存器。
物理地址=段地址×16+偏移地址,指令中出现BP作地址,则其段地址为SS,否则就为DS。
③ 8086/8088求物理地址时那些CS,DS,SS,IP什么的有什么用要怎么求,求教!
...
求物理地址时基本上恩他们没太大关系吧。。
他们只是存放数据的寄存器(相当与变量),比如把1234放到cs里,以后写cs就是1234这个东东。
然后后来就有人规定一些东西一般只放特定含义的东西。
怎么说呢,就像2l说的cs是放段基址的,在8086里一个20位的地址是由2个16位的地址构成的,所以要两个16位的寄存器才能表示一个地址,cs里的内容+另一个特定的寄存器里的内容构成一个特定的地址而且这个地址是程序的......ds+另一个构成...数据地址的..ss一般用于堆栈的。比较复杂,还是看看书把,和寻址有关。当访问不同的东西(程序,数据,堆栈)时会配上不同的(cs,ds,ss)段寄存器。
至于物理地址的求法:
一个8086里地址是20位的它由两个16位的数构成,一个叫段地址,一个叫偏移地址,
实际物理地址=段地址*10H+偏移地址,
10H是十六进制的10,(一般地址都是给出16位的形式。所以一般就是段地址后面加个0再与偏移地址相加。在程序中依据访问不同内容段地址在cs,ds,ss中选(特殊的寻址除外),例如用ip做偏移地址时,会调用cs作为段地址,实际物理地址就是cs*10h+ip,...)
④ 汇编 8086寻址方式
1. 立即寻址
立即寻址方式用来表示常数,它主要用于给寄存器赋初值,注意:只能用于源操作数字段,不能用于目的操作数字段。
例1 MOV AL,5
2.直接寻址
在IBM PC机中将操作数的偏移地址称为有效地址EA。在直接寻址方式中有效地址EA就在指令中,它存放在代码段中指令操作码之后,但操作数一般存放在数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数.
如操作数在数据段中,则物理地址=16d×(DS)十EA。1BMPC机中允许数据存放在数据段以外的其他段中,此时应在指令中指定段跨越前缀,在计算物理地址时应使用指定的段寄存器。
例4 mov AX , [2000H]
(DS)=3000H,地址32000H中的值为 3050H则,执行结果为;(Ax)=3050H
因为实际mov AX中的内容为 16d * (Ds) +2000H= 32000H
在汇编语言指令中,可以用符号地址代替数值地址,如:
MOV AX,VALUE
此时VAIUE为存放操作数单元的符号地址。如写成
MOV AX,[VALUE]
也是可以的.两者是等效的。如果VALUE在附加段中,则应该指定段跨越前缀如下;
MOV AX, ES:VALUE
或 MOV AX, ES:[VALUE]
直接寻址方式适用于处理单个变量,例如需要处理某个存放在存储器里的变量,可用直接寻址方式,将该变量先取到一个寄存器中,然后在做处理。
IBM PC机规定:除在双操作数中,除立即数外,必须有一个操作数使用寄存器方式。这也是一个常量常常送到寄存器去的原因。
3.寄存器间接址
操作数的有效地址在基址寄存器BX、BP或变垃寄存器SI、DI中,而操作数则在存储器中,如下图所示。
a.如果指令中指定的寄存器是BX、SI、DI,则操作数在数据段(DS)中,所以用DS寄存器的内容作为段地址,即操作数的物理地址为:
物理地址=16d×(DS)十(BX)
或 物理地址;16 d×(DS)十(SI)
或 物理地址=16d×(DS)十(DI)
b.如指令中指定SP寄存器,则操作数在堆栈段(SS)中,段地址在SS中,所以操作数的物理地址为:
物理地址=16d×(SS)十(SP)
MOV AX ,[BX]
如果 (DS)=2000H , (BX)=1000H 则
物理地址=16d×(DS)十(BX) = 20000H+1000H = 21000H
21000H地址里的内容为 50A0H则 执行结果为:(AX)=50A0H
c.指令中也可指定段跨越前缀来取得其他段中的数据。如;
MOV AX,ES:[BX]
这种寻址方式可以用于表格处理,执行完一条指令后,只需要修改寄存器内容就可取出表格中的下一项。
4.寄存器相对寻址方式
操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量之和。即
| (BX)
EA = | (BP) + 8位或者16位的位移量
| (SI)
| (DI)
同寄存器寻址一样 BX BP DI 若没有段跨越前缀 物理地址为=16d×(DS) +位移量+*
SP 物理地址为=16d×(SS)十(SP) + 位移量 + *
举个例子:
MOV AX,COUNT[SI] (也可表示为MOv AX,[COUKT十SI]
其中,COUNT 为16位位移量的符号地址。
如果(DS)=3000H,(SI)=2000H COUNT=3000H
则物理地址 = 30000十2000十3000 =35000H
⑤ 汇编语言中 cs, ds,ss 的区别
最近想初步了解一下汇编的内容,在网上搜了搜,发现一篇写得很不错的文章,特地转过来留存。写得浅显易懂,而且加入了很多个人的见解,比书上写的好懂多了。比较钦佩作者,可惜找了半天没有找到这篇文章的原作者是谁。转载地址: http://www.zxbc.cn/html/20070611/22772.html 学习汇编前你应该知道的知识
1、汇编需要什么工具和程序,到哪里下载?
目前阶段,汇编程序仅需要两个程序就够了。masm.exe,link.exe。 前者是编译程序,后者是链接程序。另外,为了验证和调试程序,还需要一个程序debug.exe,该程序由windows本身就提供。
将二者下载后,放到某一个目录中(任意目录都可以),考虑到很多命令需要通过键盘敲入,所以建议你不要把文件放入到长文件名目录、中文目录或很深的目录中。比如你可以建一个“D:\Masm”目录,并建议此后的程序都放这个目录,此后称这个目录为汇编目录。 2、学习汇编需要有哪些编程方面的知识?
没有任何编程方面的知识,学习此语言等于缘木求鱼,所以请放弃学习的想法。一般来说至少要知道如下几点:
*)程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(IF...THEN...ELSE...),循环结构(FOR...NEXT)三种结构。
*)知道什么是子程序,什么是调用。
*)汇编程序员的视角。不同编程视角编程要求是不一样的。比如删除文件:
>>用户的视角是找到“删除”按钮或菜单,然后单击一下即可。
>>高级程序员的视角是知道删除的文件,并发出删除命令。这些通过API实现。
>>汇编程员的视角是得到要删除的文件名,找到该文件所在位置,通过调用删除“中断命令”进行删除。
>>操作系统开发人员的视角则是接到删除命令后,先找到系统根目录区,由根目录区的链接依次找到子目录区,直到找到要删除的文件,然后按照操作系统删除文件的规则对该文件名进行修改。比如DOS,只把第一个字符改成"?"。 按程序语句等价的角度看,一行VB的打印语句,用汇编实现大约需要一百二十多行。知道汇编语言的视角后就要知道,前面的道路是坎坷的,没有耐心是不行的。想通过几分钟几行程序就完成很复杂的操作不是件容易的事。 3、学汇编有什么用?
汇编产生于DOS时代或更早,而现在是Windows时代,所以可能 遗憾地说:尽管还有批牛人在用汇编开发核心级程序,但我们几乎没什么用,除了必要时间能拿来分析一两个程序的部分代码之外,别的也就没干什么用了。并且并不是所有的汇编命令都能在windows下使用。而泛泛地追求“时髦”而学本语言,最后的结果是损了夫人又折兵。所以学之前你要考虑好。我劝那些为了当“黑客”而学汇编的人就此止步。
第零讲 预备知识 1、一个汇编程序的编译过程是怎么样的?
1)首先你需要找一个编辑器,编辑器用任何“纯文本”编辑器都可以。比如记事本。编好以后保存到汇编目录中。扩展名为asm,比如myfirst.asm。但这里建议你找一个能显示出当前行的编译器。这样出错后排错很容易。
2)然后在DOS下进入D:\Masm目录中,输入“masm myfirst.asm",如果有错系统会提示出错的行位置和出错原因。 3)然后再输入“link myfirst.obj”,即可看到当前目录下有一个myfirst.exe程序。 2、宏汇编和汇编有什么区别吗?
二者的区别在于前者提供宏,后者不提供。后者已找不到了,所以你可以认为二者没有区别。 3、机器语言、汇编语言、高级语言的关系
最早的计算机采用机器语言,这种语言直接用二进制数表示,通过直接输入二进制数,插拔电路板等实现,这种“编程”很容易出错,每个命令都是通过查命令表实现,既然是通过“查表”实现的,那当然也可以让计算机来代替人查表实现了。于是就产生了汇编语言,所以不管别人怎么定义机、汇语言,我就认为,二者是等价。后来人们发现,用汇编语言编某一功能的时候,连续一段代码都是相同或相似,于是就考虑用一句语言来代替这一段汇编语言,于是就产生了高级语言。因此,所有高级语言都能转化成汇编语言,而所以汇编语言又可转化成机器语言。反之,所有机器语言可以转成汇编语言(因为二者等价)。但并不是所以汇编语言都能转成高级语言。 4、计算机的组成
通常都把计算机定义成五部分:运算器、控制器、存储器、输入系统、输出系统。
为了简单起见,我们如此理解:运算器+控制器=CPU。存储器=内存(暂不包括外存,也不包括CACHE)。输入系统=键盘(不包括鼠标),输出系统=显示器(不包括打印机,绘图仪)。 5、寄存器和内存的区别
寄存器在CPU中。内存在内存条中。前者的速度比后者快100倍左右。后面的程序要求每条指定要么没有内存数据,要么在有一个寄存器的参与下有一个内存数据。(也就是说,不存在只访问内存的指令)。 6、汇编语言的计数
与生活中的计数不一样,汇编中的计数是从0开始的。比如16个计数,则是从0~15,而不是生活中的1~16。这一点看起来简单,真运算起来就不是件容易的事了,不信等着瞧。 7、进制问题
又与生活中不一样的地方是进制。切记下面的常识:
*)计算机内部存储都用二进制。
*)我们的汇编源程序默认都用十进制。(除非你指明类型)
*)我们用的调试程序debug默认的都是十六进制。(无法指明其他类型)
其中十六进制的十六个个位数依次是:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。 8、进制转换
一个比较简单的方法是查表法。
十进制 十六进制 二进制
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110 7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111
好了,结合6,7,8三条。大家来算一个“题”。某一组数据显示时,每个数据占了四个位置,每行共十六个。问:十六进制的13位置在哪里(第几行,第几列)。
格式如下:m m m m n n n n o o o o p p p p '注:之所以没用ABC是怕与上面十六进制弄混。
r r r r s s s s t t t t u u u u
第一讲 基础知识
1、访问内存
程序在内存中,访问内存是几乎每一程序都要进行的操作,计算机对内存编址是线性的,也就是说是一维的,比如256M的内存,地址就应该是从0~(256M-1),这个地址称为物理地址或绝对地址。
1.1 地址表示
但从汇编程序员的角度看,内存却是二维的,要说明一个地址,需要给出两个值,就象你在平面上指定一点需要说出(X,Y)坐标一样,汇编程序员的内存视角也需要两个“坐标”,前一个称为段地址(Segment),后一个称为偏移地址(Offset),该地址称为逻辑地址。
比如“1234:3DF5”就是一个地址。“1F3F:”不是一个地址,因为他只有段地址,没有偏移地址。注意此后的地址都用十六进制表示。
1.2 地址计算
前面提到,计算机编址是一维的,汇编程序员是二维的,那么二者怎么换算呢?由后者到前者的换算方法是,“段地址串”后面加个“0”,然后再加上偏移地址。
比如“1234:3DF5”(十六进制的加减运算参见相关资料)
12340 --串后加了一个0
3DF5
-----
16135 --注意此串仍然是十六进制。
所以,汇编程序员眼中的地址“1234:3DF5”就是物理地址(计算机编址):16135。
知道了由后者向前者的转换,那么由前者向后者的转换呢?
“不知道”,为什么不知道,继续往下看。
1.3 到底哪个地址对 知道了1.2的地址算法后,我又发现一个问题:
“1000:6135”的物理地址是多少呢? 10000+6135=16135。
“1001:6125”的物理地址呢? 10010+6125=16135。
......
那么到底哪个对呢?问题的回答是这样的:假设我现在让你按一下“L”键,我可以告诉你如下几种方法中的一种或几种。1 请按一下“L”键; 2请按一下键盘上第四行第十个键;3 请按一下第十列中的第四个键;4 请按一下“K”右边的键;5 按标准指法单击一下右手无名指。 举上面的例子也就是说,同一个地址有很多种表示方式,具体用哪一种,要看实际使用时的情况。但无论用哪种方式,只要能达到目的即可。(实际中该问题一般不会受此问题困扰,但初学时突然想不通)。
1.4 有多少内存可以访问
无论是段地址还是偏移地址都是四位十六进制(如果不够四位,前面补0)。也就是说:总共可以访问的地址说是:0000:0000~FFFF:FFFF。 总共FFFF0+FFFF+1=10FFF0个地址。也就是不到1M的空间。
记住如下结论:
*) 不管你实际内存有多少,目前我们只能访问不到1M的空间。
*) 而实际上连这1M也用不完。其中上端的384K的址只能读不能写,只能读,一般称为ROM。
*) 低端的640K可以读写。但这640K的低端100多K也不能随便写,因此DOS系统使用该区。
*) 原来1024M的内存,汇编程序只能使用其中400多K。这段内存的容易相当于一个普通文档的大小。不过这就足够了。
⑥ 请问ss,bp,sp具体怎么配合使用啊
BP为基地址。SP为堆栈的偏移地址
SS是堆栈段地址
物理地址表示形式为SS:SP
所以如果不存放数据时物理地址为:SS:SP=2000h:0016h
当初放了8字节数据后(堆栈单元放的是16位数据)所以地址加4即SS:SP=2000h:001ah
⑦ 什么时候段基址在ES、SS中
消灭0回复
⑧ 汇编语言 mov ax, [ bp ] 在求物理地址时 为什么使用ss为段地址而不实用ds为段地址
1)MOVAX,ES:[1000H]AX=9ABCH地址:31000H算法:ES*10H+1000H声明的段寄存器ES2)MOVAX,[BX]AX=3412H地址:21000H算法:DS*10H+BX默认段寄存器DS3)MOVAX,[BX][SI]AX=?地址:21001H算法:DS*10H+BX+SI默认段寄存器DS这道题是不是你哪里敲错了,你题中没有这个21001H地址4)MOVAX,[BP+DI]AX=9A78H地址:41002H算法:SS*10H+BP+DI默认段寄存器SS方括号里面代表地址,比如movax,[bx]就等于movax,[1000h],冒号代表段前缀,冒号前面的是段寄存器,将以指明的段寄存器寻址,段寄存器*10H+后面的地址即是物理地址,如果没有指明段前缀,将以默认的段寄存器寻址,BX,SI,DI这3个寄存器默认的段寄存器是DS,BP的默认段寄存器是SS