① 汇编语言中 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。这段内存的容易相当于一个普通文档的大小。不过这就足够了。
② es是前任吗
不是,
ES这个缩写和他的前任VaR一样非常没有特点,极其容易被混淆,比如程序员就会想到滑乎纯Extra Segment和Engineer Station,游戏宅会想到Earth Shaker和Evil Sylvanas,足球迷会想起Espanyol,歌迷会顷卖想起陈奕迅信咐。
③ 堆栈和堆栈段的区别
你说的堆栈 是指内存中的 堆和栈吧, 有些人也喊栈叫 堆栈, 堆和栈是操作系统为应用程序在内存中分配的一部分空间,栈通常是用来保存局部变量等,弹栈压栈操作等,肢昌 而堆通常是用来存储程序员申请的空间,比如new操作,通常需要程序员自己去delete,不然就形成僵尸内存,
而堆栈段 应该是汇编里面的 堆栈段寄存器中的一个说法吧?
堆栈段寄存器在汇编中称为 SS, Stack Segment, 是一种寄存器 。是cpu的组件吧。
以下是的
为历扰扒了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;李李
ES(Extra Segment):附加段寄存器。
当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。
以上纯属个人见解~ 不要拍我
④ 通用寄存器和专用寄存器有什么区别和联系
对于8086的系统:
1.寄存器按照功能的不同可分为通用寄存器(AX,BX,CX,DX,SP,BP,SI,DI。其中的前四个寄存器可分别分成AH,AL ;BH,BL;CH,CL;DH,DL的八位寄存器)、指令指针寄存器(IP)、标志寄存器(FLAGS)、段寄存器(CS,DS,ES,SS)。它们的区别和联系体现在它们的功能上,对它们的深入了解和正确运用需要通过编写程序来实现。
2.大致功能如下:
AX,可存放一般数据,而且可作为累加器使用;
BX,可存放一般数据唯蠢,而且可用来存放数据的指针(偏移地址),常常和DS寄存器连用;
CX,可存放一般数据,而且可用来做计数器,常常将循环次数用它来存放;
DX,可存放一般数据,而且可用来存放乘法运算产生的部分积,或用来存放输入输出的端口地址(指针);
SP,用于寻址一个称为堆栈的存储区,通过它来访问堆栈数据;
BP,可存放一般数据,用来存放访问堆栈段的一个数据区,作为基地址;
SI,可存放一般数据,还可用于串操作中,存放源地址,对一串数据访问;
DI,可存放一般数据,还可用于串操作中,存放目的地址,对一串数据访问;
IP,用于寻址当前需要取出的指令字节,程序员不能对它直接大宴操作;
FLAGS,用于指示微处理器的状态并控制它的操作;
CS,代码段寄存器,代码段是一个存储区域,存放的是CPU要使用的代码,CS存放代码段的段基地址;
DS,数据段寄存器,数据段是包含程序使用的大部分数据的存储区,DS中存放数据段的段基地址;
ES,附加段寄存器,附加段是为某些串操作指令存放目的操作数而附近的一个数据段,ES中存放该数据段的段基地址;
SS,堆栈段寄存器,堆栈段是内存中一个特殊的存储区,用于暂时存放程序运行时所需的数据或地址信息。SS中存放该存储区的段基地址。
基本功能就是这些,要想透彻掌握深层的寄存器功能,必须要编写汇编源程序,可用微软的masm汇编程序进行编译,用dos系统自带的debug命令调试,直到程序正确运行,才能体会其中的奥妙。
最后,还是用我的导指仿陪师给我的一句话吧:“记住,学好汇编语言最重要的环节永远是上机调试出正确程序!”
共勉!
⑤ 汇编语言寄存器都叫什么
1、寄存器
32位寄存器有16个,分别是:
4个数据寄存器(EAX、EBX、ECX、EDX)。
2个变址和指针寄存器(ESI和EDI);2个指针寄存器(ESP和EBP)。
6个段寄存器(ES、CS、SS、DS、FS、GS)。
1个指令指针寄存器(EIP);1个标志寄存器(EFlags)。
2、数据寄存器
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器猛基的时间。
32位CPU有4个32位通用寄存器:EAX、EBX、ECX和EDX。对低16位数据的取存,不会影响高16
位的数据,这些低16位寄存器分别命名为AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:ah~al、BX:bh~bl、CX:ch~cl:DX:dh~dl)。
每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可合可分”的特性,灵活地处理字/
字节的信息。
AX和al通常称为累加器,用累加器进行的操作可能需要更少时间,累加器可用于乘、除、输入/输出等操作,
它们的使用频率很高。
BX称为基地址寄存器,它可作为存储器指针来使用。
CX称为计数寄存器,在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用cl来
指明位移的位数。
DX称为数据寄存器,在进行乘、除运算时,枝巧谨它可以为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU
中,宽核其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据、保存算术逻辑运算结果,而且也可
作为指针寄存器,所以,这些32位寄存器更具有通用性。
3、变址寄存器
32位CPU有2个32位通用寄存器ESI和EDI,其低16位对应先前CPU中的SI和DI,对低16位数据的
存取,不影响高16位的数据。
ESI、EDI、SI和DI称为变址寄存器,它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器
操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器,作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们可作一般的存储器指针使用,在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的
功能。
4、指针寄存器
32位CPU有2个32位通用寄存器EBP和ESP,其低16位对应先前CPU中的BP和SP,对低16位数
据的存取,不影响高16位的数据。
EBP、ESP、BP和SP称为指针寄存器,主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器
操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器,作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们主要用于访问堆栈内的存储单元,并且规定:
BP为基指针寄存器,用它可直接存取堆栈中的数据。
SP为堆栈指针寄存器,用它只可访问栈顶。
5、段寄存器
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
32位CPU有6个段寄存器,分别如下:
CS:代码段寄存器 ES:附加段寄存器
DS:数据段寄存器 FS:附加段寄存器
SS:堆栈段寄存器 GS:附件段寄存器
在16位CPU系统中,只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问,在
32位微机系统中,它有6个段寄存器,所以在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的,有关规定
简单描述如下:
实方式:段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑
地址仍为“段地址:偏移地址”的形式,为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移地址。
保护方式:在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”的某个值。
6、指令指针寄存器
32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP是存放下次将要执行的指令在代码段的偏移地址,在具有预取指令功能的系统中,下次要执
行的指令通常已被预取到指令队列中,除非发生转移情况,所以,在理解它们的功能时不考虑存在指令队列的情
况。
在实方式下,由于每个段的最大范围为64KB,所以,EIP的高16位肯定都为0,此时,相当于只用其低16
位的IP来反映程序中的指令的执行次序。
7、标志寄存器
1.运算结果标志位。一共6个,包括:CF进位标志位、PF奇偶标志位、AF辅助进位标志位、ZF零标志位、
SF符号标志位、OF溢出标志位。
2.状态控制标志位。一共3个,包括:TF追踪标志位、IF中断允许标志位、DF方向标志位。
以上标志位在第7章里都讲过了,在这里就不再解释了,现在讲讲32位标志寄存器增加的4个标志位。
1. I/O特权标志IOPL。
IOPL用两位二进制位来表示,也称为I/O特权级字段,该字段指定了要求执行I/O指令的特权级,如果当前
的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
2. 嵌套任务标志NT。
NT用来控制中断返回指令IRET的执行。具体规定如下:
(1) 当NT=0,用堆栈中保存的值恢复EFlags、CS和EIP,执行常规的中断返回操作。
(2) 当NT=1,通过任务转换实现中断返回。
3. 重启动标志RF。
RF用来控制是否接受调试故障。规定:RF=0时,表示接受,否则拒绝。
4. 虚拟8086方式标志VM。
如果VM=1,表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。
8、32位地址的寻址方式
最后说一下32位地址的寻址方式。在前面我们学习了16位地址的寻址方式,一共有5种,在32位微机系统
中,又提供了一种更灵活、方便但也更复杂的内存寻址方式,从而使内存地址的寻址范围得到了进一步扩大。
在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为
偏移地址的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、
EDX、ESI、EDI、EBP、和ESP)都可以是偏移地址的一个组成部分。
当用32位地址偏移量进行寻址时,偏移地址可分为3部分:
1. 一个32位基址寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)。
2. 一个可乘以1、2、4、8的32位变址寄存器(EAX、EBX、ECX、EDX、ESI、EDI和EBP)。
3. 一个8位~32位的偏移常量。
比如,指令:mov ebx, [eax+edx*2+300]
Eax就是基址寄存器,edx就是变址寄存器,300H就是偏移常量。
上面那3部分可进行任意组合,省去其中之一或之二。
下面列举几个32位地址寻址指令:
Mov ax, [123456]
Mov eax, [ebx]
Mov ebx, [ecx*2]
Mov ebx, [eax+100]
Mov ebx, [eax*4+200]
Mov ebx, [eax+edx*2]
Mov ebx, [eax+edx*4+300]
Mov ax, [esp]
由于32位寻址方式能使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的规定,具体
规定如下:
1. 地址中寄存器的书写顺序决定该寄存器是基址寄存器还是变址寄存器。
如:[ebx+ebp]中的ebx是基址寄存器,ebp是变址寄存器,而[ebp+ebx]中的ebp是基址寄存器,ebx是变
址寄存器,可以看出,左边那个是基址寄存器,另一个是变址寄存器。
2. 默认段寄存器的选用取决于基址寄存器。
3. 基址寄存器是ebp或esp时,默认的段寄存器是SS,否则,默认的段寄存器是DS。
4. 在指令中,如果显式地给出段寄存器,那么显式段寄存器优先。
下面列举几个32位地址寻址指令及其内存操作数的段寄存器。
指令列举: 访问内存单元所用的段寄存器
mov ax, [123456] ;默认段寄存器为DS。
mov ax, [ebx+ebp] ;默认段寄存器为DS。
mov ebx, [ebp+ebx] ;默认段寄存器为SS。
mov ebx, [eax+100] ;默认段寄存器为DS。
mov edx, ES:[eax*4+200] ;显式段寄存器为ES。
mov [esp+edx*2], ax ;默认段寄存器为SS。
mov ebx, GS:[eax+edx*8+300] ;显式段寄存器为GS。
mov ax, [esp] ;默认段寄存器为SS。
⑥ ES与传统数据库的比较
1.结构名称不同
2.ES分布式搜索,传统数据库遍历式搜索
3.ES采用倒排索引,传统数据库采用B+树索引
4.ES没有用户验证和权限控制
5.ES没有事务的概念,不支持回滚,误删不能恢复
6.ES免费,完全开源;传统数据库部分免费
有关更详细的比较内容,可以到黑马程序员官网找到社区技术文章,找不到可以对话框问一下。里面还有结合工作的举例。
⑦ 段寄存器一共有哪些
数据段寄存器DS
代码段寄存器CS
堆栈段饥旁寄存器SS
附加段[有的称扩展段烂哗橡]寄存器芦顷ES
⑧ 什么叫汇编语言
问题一:什么是汇编和汇编语言? 汇编语言是一种低级计算机编程语言,说低级并不是指语言的功能和复杂程度,而是它出现在计算机发展史的早期,但现在仍广泛应用于计算机开发领域,应为它是绝大多数语言的基础.再者,它是一种面向机器的语言,即它运行与操作都与计算机硬件密切相关.
C语言是一种高级语言,它有利于人为操作,近于面向对象与面向机器之间(VB就是一种面向对象的编程语言),它的功能更加强大,可移植性高,是当今最广泛的语言之一.
DOS汇编是说汇编语言的操作界面是DOST系统,这也说明是汇编是更低级一些,但执行鼎度是其它语言无法相比的,就是可移植性较差.
问题二:汇编语言中@是什么意思 #表示立即数寻址。采用立即寻址方式的指令,在立即数前面加上立即寻址符“#”。
例如指令MOV A,#30H中30H就是立即数,指令功能为将30H赋给累加器A。
@表示寄存器的间接寻址。
例如指令MOV A,@R0就使用了寄存器间接寻址方式,这条指令的意义为将地址指针R0指向的内部数据存储器单元中的数据送入累加器A中。假设R0中内容为30H,则此指令的功能是以R0寄存器的内容30H为地址,把内部RAM 30H单元中的内容传送给累加器A。
问题三:汇编语言里*是什么意思 其表示去0x804a260地址处的内存内容
参考blog.csdn/...314473
问题四:什么是汇编语言 汇编语言它是计算机语言,计算机语言说通俗点就是人类与计算机(CPU)沟通的桥梁,计算机它不认识人类的语言,听不懂也读不懂,要让计算机替我们去完成我们的工作,就需要我们将要交给计算机完成的任务翻译为计算机语言。汇编语言是各种语言中的一种,它属于低级的计算机语言,这是相对于面向过程的C语言,以及面向对象的C++,java而言。它是除机器语言以外最接近硬件的计算机语言,而且可以通过学习汇编语言深入的了解操作系统的底层运行机制,并以CPU的角度思考问题。这样可以让你在编写高级语言的程序的时候避免旅弯很多错误,并且能更深入理解高级语言的执行 原理。因为汇编语言属于低级语言,所以既然低级就肯定不容易被普通用户认识,这需要一定的硬件基础知识和一些计算机工作原理的知识。以前在大学阶段学过汇编语言,但没有当回事儿,连作业都是复制加粘贴完成的(像这样的不在少数瞎山吧:))。工作以后才发现这个语言是个好东西,它其实是个非常重要的基础课程。所以现在有时间就把书打开多看一点,学一点。汇编语言目前常见的有两种:一个是基于8086/88架构的DOS下的16位汇编语言,还有就是基于80386架构及其以后型号的windows下32位汇编语言。我不知道linux下有没有汇编语言。顺便说一下,不管什么汇编语言它所编出来的程序都属于软件,所以不管什么软件都需要依赖操作系统这个基础平台,它才可以被硬件CPU所执行,因为操作系统就是提供硬件与用户之间的接口,所有软件都要通过它来分配到硬件资源(不知道对不对哈:)才可以被执行)。一般先学习16位的DOS汇编,然后再学32位的windows汇编。所以我们先谈谈16位的DOS汇编哈。要学汇编语言首先就是要了解CPU,你只有了解了CPU才能了解汇编语言的执行,因为它基本就是直接在磨镇中操作CPU的各个组成单元(像寄存器)。在 *** 上找了这个图,如下:上面这个CPU的逻辑结构图是8088的,8088和8086大的架构差不多,所以就以这个为例介绍下各个组成部分的作用。主寄存器:AX(AH,AL)累加寄存器,一般用作暂存数据;BX(BH,BL)基址寄存器,一般用作偏移地址存放;CX(CH,CL)计数寄存器,一般用在循环控制次数;DX(DH,DL)数据寄存器,好像和AX差不多吧;SP堆栈指针寄存器,栈指针;BP基址指针寄存器,可作SP使用;SI源变址寄存器和DI目的变址寄存器,这两个做为BX扩展用于偏移地址存放。段寄存器: CS:代码段寄存器,任何一个程序都是从代码段开始执行的,CS寄存器指明了代码段的段地址。DS:数据段寄存器,存放程序中数据部分的段地址。SS:堆栈段寄存器,堆栈是内存中特殊的内存块,堆与栈不同,目前我只知道栈是尊循“先进后出,后进先出”的原则而使用。ES:附加段寄存器,应该是作为DS数据段寄存器的扩充吧。地址加法器: 这是用在对内存寻址时所使用,它通过将段寄存器中的段地址与BX、SI、DI等寄存器中的偏移地址作一定处理从而输出物理地址,然后就可以访问内存单元了。汇编程序中的地址只是逻辑地址,并不是真实的内存上的地址。在程序实际运行时每次访问内存都会先将逻辑地址转换成物理地址才可以访问到物理内存。关于CPU寻址,逻辑地址,物理地址我也会再写篇文章来讨论。逻辑运算单元和控制单元:这是CPU最核心的单元,我们暂只记住它们是负责执行与控制就好了。内部数据,地址总线:CPU内部各部件之间通信的通道。外部地址总线:用来传输CPU想要读取/写入内存单元的物理地址。它的宽度就决定了CPU能够访问的内存的最大容量。外部数据和控制总......>>
问题五:汇编语言中,[ ]是什么意思? mov al,bvar
mov al,[bvar]
这两个是一样的 都是取变量bvar的值.
问题六:汇编语言中$是什么意思 “$”是汇编语言中的一个预定义符号,等价于当前正汇编到的段的当前偏移值。
指令“jmp $+3”中的“$”表示当前这条指令在代码段中的偏移量。指令“jmp $+3”表示要向前跳转到距离这条指令3个字节的地方。若是“jmp $-3”,则表示要向后跳转到距离这条指令3个字节的地方。
“$”可用于表达式,并且可以用于表达式的任意位置。
更具体的内容,请参阅汇编语言的“预定义符号”章节。
问题七:汇编语言,这句代码到底是什么意思?? PTR是指针的意思, DWORD PTR 是DWORD 类型的指针
即 把 ebp+_tb 处开始的 sizeof(DWORD) 个字节当成一个DWORD , 拷贝到ecx寄存器。
用C语言伪码
ecx = *( (DWORD*)(ebp+_tb) );
问题八:汇编语言 CLRB 是什么意思??? 宏指令 CLRB,完成用空格符将一字符区中的字符取代的工作。
问题九:编程语言和汇编语言有什么区别啊 计算机语言从低级到高级可以分为:
机器语言,即由0、1组成的机器硬件可以识别的语言;
低级语言,即汇编语言
中级语言,如C语言
高级语言,如C++,JAVA,C#等。
汇编语言是将由0、1组成的机器语言用具有简单语义的英文代码表示,以便于理解和程序员编程。汇编语言通常用于对硬件的直接操控。由于汇编语言编写的程序很小,所以通常在程序中最核心的、控制硬件的代码可以采用汇编语言编写,一方面是安全,另一方面提高运行速度。
对于计算机的初学者,应该从中高级语言学起,如c语言,vb,java等,如果你是想要学习如何编程,学习一到两门高级语言已经够用了。
如果你已经掌握了基本的编程技能,最好是可以学习数据结构和操作系统以及计算机硬件的基本工作原理,以便优化你编写的程序,提高安全性和运行效率。
如果你想要从事更高级的开发工作,则可能需要学习汇编语言。
在高校中,计算机科技专业的学生汇编语言是必修课,而软件工程专业的学生则对汇编语言不做要求。
至于汇编与编程的区别是显而易见的,汇编语言是一种用于编写某些程序的语言。而编程则是程序员用某种语言编写程序的过程。
问题十:汇编语言的与和或是什么意思 与和或就是逻辑运算,与: AND AX,BX;将AX中的内容与BX相与存入AX中,与就是条件要一起满足,例如AX中的二进制数是10111111,BX中的数是11100000,那么相与只有AX中就是10100000,因为只有bit5和bit7都为真。
类似,或就是只要有一个为真就为真,OR AX,BX;将AX中的内容与BX相或存入AX中,两个寄存器内容相或后,AX中就变成了11111111。
⑨ 汇编语言中的堆栈段指针是干什么的
堆栈段指针(寄存器SS)是用于确定堆栈在内存中的起始位置的寄存器;堆栈段寄存器的作用和其他段寄存器(CS,DS,ES)相同,都是为了在一整段的内存中划分区域:由于内存为一整段储存单元,CS(代码段寄存器)中存放代码段的起始位置,DS(数据段寄存器)中存放数据段的起始位置,SS(堆栈段寄存器)中存放堆栈段的起始位置,ES(附加段寄存器)中存放附加段的起始位置。
在操作系统孝斗架构的内存中,堆栈位于程序所使用内存的顶端,向内存低地址处扩展,DS寄存器中存放的是堆栈最低的地址。滑耐堆栈本身为内存的一部分,但是相对普通内存段(DS)的区别在于:普通内存段(DS)一般用于存放长久数据,无特殊存储顺序;堆栈内存段(SS)一般用于存放暂时数据(例如调用函数是的参数),可以使用PUSH,POP指令向栈顶压入,弹出数据。
另外,若SP(栈顶寄存器)中的值小于DS寄存器(PUSH指令执行过多次)将会引发错误:系统显示某某程序Stack Overflow(因为SS段往下的内存地址属于数据段的区域)。若SP中的值大信慎春于一定程度(由程序的堆栈段大小决定)(POP指令执行过多),也将会引发错误:系统显示某某程序Access Violation Reading Address(因为程序内存的顶端上有着其他数据)。
需要注意的是,在较新的操作系统下汇编其平台下的程序时,程序员将无法修改段寄存器中的值(修改会报错),它们由操作系统自身管理(可以理解为由操作系统编写者的代码管理),其原因是出于安全起见。