鸿 网 互 联 www.68idc.cn

汇编语言V2cn学习小结

来源:互联网 作者:佚名 时间:2015-09-03 08:24
汇编语言V2cn学习小结 ———— 博客,http://blog.csdn.net/shunqiziranhao007/article/details/8096469 日期,2012年10月21日 星期日 ———— 大二上2009年11月,上了《微型计算机原理与接口技术》课程,学习了下8086汇编语言,感觉蛮有意思,在网上看到
汇编语言V2cn学习小结
————
博客,http://blog.csdn.net/shunqiziranhao007/article/details/8096469
日期,2012年10月21日 星期日
————
大二上2009年11月,上了《微型计算机原理与接口技术》课程,学习了下8086汇编语言,感觉蛮有意思,在网上看到了,汇编网,http://www.asmedu.net/ ,去买了本王爽的《汇编语言V2cn》学习。这本书还是很不错的,循序渐进的教学方式让我学起来不怎么困难。花了不少时间学完之后就没怎么继续深入下去,仅仅是当作了解了下汇编语言。3年过去了,学的东西忘得差不多了。前些天在看《深入理解计算机系统V2cn》,看到《第3章:程序的机器级表示》,发现是讲汇编的,就打算花些时间复习下以前学的《汇编语言V2cn》,花了两天时间回顾了这本书,整理了一下以前敲写的代码,做了一些笔记。学习汇编语言对学习C语言有帮助。
 
————
前言
————
这部分的内容还是值得看的。看看作者的教学思想,可以转化自己的学习思想,学习应该循序渐进。
 
————
ch1基础知识
————
机器语言果然很霸气。
汇编语言:汇编指令,伪指令,其他符号。
二进制要么是指令要么是数据,二选一。
cpu和存储器的交互,从哪里开始,读还是写,多少字节?
地址总线寻址,n,2的n次方。
数据总线,传输数据,n,2的n次方。
8086,地址总线20,数据总线16。
内存地址空间分配。
 
————
ch2寄存器
————
对于寄存器,我要思考的是,为什么需要这个寄存器?它的出现的目的是什么?它可以哪来干什么?寄存器这么宝贵的东西不是想加就加的,必然是由于某种需求才产生的?
8086的通用寄存器,16位,AX,BX,CX,DX,又分为高8H(15-8),低8L(7-0),如AX分为AH,AL。
学会2,8,16进制的任意转换,1,3,4的分割。
mov 目的d,源s   d=s
add 目的d,源s   d=d+s
操作数的类型?
操作时,操作数的位数是否相同?
如何用16位的数来表示20位的地址?1个肯定不够,那么我就用2个,错开相加,物理地址=段地址*16+偏移地址。当然这样做有个问题是,同一个物理地址将对应多种(段地址,偏移地址)。
CS,IP是最重要的寄存器,的确,这个控制了程序的流程。8086,任意时刻,将CS:IP(表示CS*16+IP)指向的内容当作指令(不是数据)并执行。时刻注意CS:IP的变化。
p26——图2.15,在这里我有一个疑问就是,cpu是怎么知道读取那三个字节的?cpu是根据机器码进行识别到底应该读取多长的指令的。比如moval,00其机器码是1011000000000000mov的机器码是1011,al的机器码是0000,cpu就判定这条指令的长度是2个字节。再如moval,[0000]其机器码是10100000(后面16位0)这是寄存器寻址,后面紧跟的16位的地址偏移量,cpu就判定这条指令的长度为3字节。
p27——注意cpu读取完指令后,并没有直接执行,而是先让IP中的值自动增加,这个值增多少呢?看前面关于
cpu是怎么读取三个字节的解析。
先是读取指令,然后增加IP,然后再执行指令。
代码段的概念有利于理解。
 
————
实验1查看cpu和内存,用机器指令和汇编指令编程
————
win键+R,输入command进入虚拟8086模式。输入debug进入Debug模式。下面一些选项。
R→review审查,查看或改变寄存器的信息,不会执行汇编指令。
T→trial试用,单步调试,会执行汇编指令,ip自加了,显示下一条要执行的指令。
D→display显示,显示ds开始的数据。
E→erase擦除
U→unassembly 反汇编,查看cs:ip开始的汇编指令。
A→add 添加汇编指令
Q→quit 退出
详细的功能看书上介绍。
 
————
ch3 寄存器(内存访问)
————
[xxx]表示从DS:xxx。
8086不支持将数据直接送入段寄存器的操作,mov ds, 1000H 是错误的,需要一个中介如bx。
字类型的操作,注意高低位的数据!
操作数,有3种,数据,寄存器,内存单元。
区分好字节和字类型的操作。
栈后进先出。
栈底高位,栈顶低位,为什么不是先用掉前面的内存,再用后面的内存呢?好容易记错啊。为什么栈的增长是从高地址向低地址方向增长呢?因为这样就可以通过初始化SP来确定栈的大小了,一直调用push,sp一直减,直到减到0,表示栈用完了。
SS:SP始终指向栈顶元素,注意是元素而不是元素的上一个。
压栈是先腾出位置即sp-2然后在写入内容。入栈是先取数据然后再sp+2。栈为空时,栈顶元素不存在,而sp则指向栈底的下一个单元。
栈越界将覆盖他人的数据,很危险,跟数据越界访问一样,危险。
提供:SS、SP指示栈顶元素,改变SP后写内存的push,读内存后改变SP的pop,这就是8086CPU提供的栈操作机制。
将10000H~1FFFFH当作栈段,SS=1000H,SP=? 这个好容易搞错,解法是先求出栈有一个元素时的SP=FFFEH,然后pop,栈就是空栈了,SP=SP+2=0000了,SS:SP=10000H??让我想得很蛋疼。
执行mov ss,ax 后紧接着就执行了mov sp,10 ,这样做为了更安全的产生一个栈段,防止sp被改变。执行mov ss,ax后,cpu根本就不响应任何中断了。
 
————
实验2 用机器指令和汇编指令编程
————
为什么2000:0~2000:f中的内容会发生改变?
答:因为用T指令进行调试时,会产生中断。而为了保护现场,CPU则先将标志寄存器进栈、再把当前CS的值进栈,最后将IP的值进栈。
 
————
ch4 ch一个程序
————
SA+10H,注意这是段加值不是偏移地址加值,其实相当于加了100H。
首先要知道我们的CS:IP是多少,然后将CS减去10H所求得的 段:偏移地址 就是PSP的首地址了。PSP的头两个字节的值为 CD 20 .
 
————
实验3 编程、编译、连接、跟踪
————
 
————
ch5 bx和loop指令
————
我们要完整描述一个内存单元,需要两种信息,内存单元的首地址,内存单元的长度,这个跟C语言中的指针很像。
ds好像比较孤单,没有固定的寄存器和它搭配?bx成了ds的基友了?
cx和loop搭配的,loop的操作是先将cx减1,然后判断cs的值是否为0,为0向向下执行,不为则跳至标号处执行,怎么跳的?
汇编程序中,数据不能以字母开头,所以要在字母前面加上0.
p命令可以越过循环。
g命令可以跳至指定的cs:ip处。
编译器masm把指令中的[xx]解释为xx。
ds:[0] 来显式指明获取内存的值。
如果在[]里用寄存器,如bx,则段地址默认在ds中,也就是说ds和bx搭配了。
0:200 - 0:300 内存段比较安全。
每个寄存器的产生都是有原因的,比如es,它可以辅助我们操作两段内存。
 
————
ch6 包含多个段的程序
————
分段存储东西。
 
 
————
ch7 更灵活的定位内存地址的方法
————
这下我们知道为什么要引入SI DI了,用来拷贝内容。
需要暂存东西时,使用栈来存储。
 
————
ch8 数据处理的两个基本问题
————
这一章的是总结的,好好看下。
mov ax, [bx+bp]
mov ax, [si+di]
上面指令错误的。
bp跟ss搭配呀,就像bx和ds搭配一样。一个sp不能满足某些栈的操作,所以再加个bp来帮忙??
mov ax, [bp] 段地址默认是ss。
div,除数8,被除数16,被除数默认为ax,结果,al商,ah余数。除数16,被除数32,被除数默认为高位dx,低位ax,结果,ax商,dx余数。低位商,高位余数。
db, dw, dd ,dup
 
————
ch9 转移指令的原理
————
在执行指令前,ip就自增了。
jmp指令不知道目的地址是多少,但是它知道自己应该将ip偏移多少。
jmp short 标号
jmp near ptr
jmp far ptr
loop先减cx,然后再判断是否为0。
转移越界,编译器将报错。
 
————
ch10 call和ret指令
————
call 标号
标号:
ret
上面这种方式实现了子程序。这样就可以进行模块化编程了。
mul指令,8位,ah,结果ax;16位,ax,结果高位dx,低位ax。
在子程序的开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前再恢复。
 
————
ch11 标志寄存器
————
结果为0,zf=1,不为0,zf-0。
结果中的1为奇数个,pf=0,偶数个,pf=1。
结果为负,sf=1.
cf为进位标志。of为溢出标志。cf和of的区别是,cf是对无符号数运算有意义的标志位,of是对有符号数运算有意义的标志位。
adc是带进位加法指令。sbb带借位减法指令。
cmp指令。
 
————
ch12 内中断
————
不是说有256个中断吗?怎么只用0000:0000到0000:03E8的1000个单元存放呢?
中断向量表中,高地址字为段地址,低地址字为偏移地址。
 
————
ch13 int指令
————
看代码。
 
————
ch14 端口
————
端口的读写,in读入,out写出,紧接的都是目的。
70h为地址端口,71h为数据端口。
shl shr
bcd码是4位2进制表示10进制的编码方法,如2为0010。
 
————
ch15 外中断
————
tf,if是用来控制是否响应中断的。
 
————
ch16 直接定址表
————
在后面加有“:”的地址标号,只能在代码段中使用,不能在其他段中使用。
seg,offset
 
 
————
ch17 使用bios进行键盘输入和磁盘读写
————
 
————
综合研究 附注
————
附注4 栈传递参数
————
分析C语言程序编译后的汇编语言程序。
 
 
网友评论
<