首页
社区
课程
招聘
[旧帖] [原创]汇编语言学习跟踪,正在学习汇编的新人们,进来一起进步吧~ 0.00雪花
发表于: 2011-4-10 11:16 6823

[旧帖] [原创]汇编语言学习跟踪,正在学习汇编的新人们,进来一起进步吧~ 0.00雪花

2011-4-10 11:16
6823
首先感谢  张宇zhangyv   童鞋无私提供的资料~
http://bbs.pediy.com/showthread.php?t=124346
那里面真的有很多很有用的东西,昨天借学校校园网的下载之便(6MB/s的速度真的很BT。。),下了很多关于汇编的书籍和视频。当然作为新人,还是希望有个能看能听能讲的老师来交授这门语言技术,所以我选择了中山大学汇编语言教学视频系列。虽然昨天晚上只学习了2堂课,但是说真的,是收益匪浅啊!!
可能是自己有C语言基础的缘故,所以觉得前2课学习很轻松。但是也确实让我理解了关于补码和字节,字等关系,和二进制和十六进制的转换关系。以前含含糊糊的东西,现在确实懂了。这个很不容易啊。。并且自学的感觉。。妥妥的。。
之后,我会把自己学习的汇编笔记一点一点的发出来给大家分享,不足之处请大家给我指出来。在学汇编的新人朋友,一起加油吧~~~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (93)
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
<1>中山大学-1
1.二进制数用B,所有数小于2。转十进制:各位二进制数码乘以与其对应的权之和

2.十六进制数用H,所有数字小于F。转十进制:和二进制一样

3.二进制转十六进制:一个二进制数,把它从地位到高位的每4位组成一组,直接用十六进制表示
0011  0101  1011  1111
3     5     B     F
0011010110111111 B=35BF H

4.十六进制转二进制:与上面相反
A19C H=1010000110011100 B

5.把一个数连同其符号在内在机器中的表示加以数值化,这样的数称为机器数。最高有效位决定该数正负:正数用0表示,负数用1表示。常用的有原码,补码(一般都用这个)和反码表示法

6.有符号整数
正数采用符号绝对值表示:【+1】补=00000001,【+127】补=01111111
负数X用2的n次方-【X】来表示,其中n为机器的字长:当n=8时:【-1】补=2的8次方-1=11111111,【-127】补=2的8次方-127=10000001
注:在补码表示法中0只有一种表示,00000000
n位二进制能够表示,有符号整数的范围是:-2的(n-1)次方≤N≤-2的(n-1)-1
8位表示数的有符号整数范围为:-128~+127
16位表示数的有符号整数范围为:-32768~+32767

7.无符号数
n位二进制数能够表示的无符号整数的范围是:0≤N≤2的n次方-1
8位无符号整数范围为:0~255
16位无符号整数范围为:0~65535

8.符号扩展
当要扩展的数是无符号数(或者符号为正)时,只要在最高位前扩展(m-n)个0【m肯定大于n】
符号为负是,先求补再加1

9.求补运算:对一个二进制数按位取反后在末位加1的运算
+3  00000011
-3  11111101
================我是无敌分割线=========================

这是我自己觉得比较重要的东西,知道的当自己巩固,不知道的当学习吧~~
各位大牛可能觉得这些很简单。。没关系啦,给新人点支持就行~~
2011-4-10 11:19
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
<2>中山大学-2
1.补码的加法规则:X+Y=X+Y                 (都是补码运算)

2.补码的减法规则:X-Y=X+(-Y)                (都是补码运算)

3.ASCⅡ码有128个字符,ASCⅡ扩展码有256个字符。

4.A为41H,65D a为61H,97D

5.国标码和变形国标码
国标码是16位编码,高8位表示汉字符的区号,低8位表示汉字符的位号
变形国标码是在国标码的基础上加上8080H(1000000010000000)
所以变形国标码的第15和第7位是1,国标码的第15和第7为是0

6.字节
一个字节由8个二进制位组成
7  6  5  4  3  2  1  0
一个字节可分成2个4位的位组,称为半字节

7.字
2个字节组成一个字
字的低8位称低字节,高8位称为高字节

8.双字
2个字组成一个双字
低16位称为低字,高16为称为高字

9.四字,十字节
2个双字组成一个四字
十字节由10个字节组成,含80个二进制位。可以用于储存非常大的数或者较多的信息

10.字符串
字符串是指由字符构成的一个线性数组,通常每个字符用一个字节表示,有时用一个字或双字表示

================我是无敌分割线=========================

由于不会打N次方所以上面都是以那种纠结的方式表示出来的,囧~~
2011-4-10 11:21
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
中山大学这部是视频经典  

书得话是王爽的汇编第二版 都很棒  而且王爽的汇编有个专门的论坛 一般的问题论坛里都有详解
2011-4-10 12:48
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
5
支持一下~~
2011-4-10 13:16
0
雪    币: 278
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很不错 我也在看
2011-4-10 13:33
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
视频我就是看的这个,书的话也是你说的那本,都感觉很不错
知识很细,而且很详细~
2011-4-10 15:05
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

救命啊,正在看第三课。。各种啥子寄存器的东西。。。搞的我头都大了。。晕啊晕。。
2011-4-10 20:59
0
雪    币: 24
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
LZ加油……那个很经典的……我还有几集就看完了,还觉得舍不得啊
2011-4-10 21:10
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
<1>中山大学-3
1.数据寄存器
用来保存操作数或运算结果等信息,他们的存在节约了存取操作数所需占用

的总线和访问存储器的时间。
16位寄存器(14个):AX(和AL被称为累加器,通过累加器进行计算效率最

高),BX(基址寄存器,是A,B,C,D中唯一一个可以作为存储器指针使用的

寄存器),CX(字符串操作或者循环操作时使用,控制循环次数),DX(做32

位乘除法时,存放被除数或者保留余数)
8位寄存器(8个,分别为对应16位的高,低8位寄存器):AH,AL,BH,BL,

CH,CL(移位时使用,保存移位位数),DH,DL

2.变址寄存器(16位)
用于存放单元地址的偏移,或某组存储单元开始地址的偏移,即作为存储器

(短)指针使用
SI(源地址)(串操作时)源操作数
DI(目的地址)(串操作时)目的操作数

3.指针寄存器(16位)
SP(堆栈指针)保存栈顶地址
BP(基址指针)堆栈数据区基址的偏移

4.通用寄存器
数据寄存器,指针寄存器和变址寄存器统称为通用寄存器。这些寄存器除了

各自专门用途外,它们均可用于传送和暂存数据,可以保存算术逻辑运算中

的操作数和运算结果

5.段寄存器(16位)
8086/8088CPU依赖其内部的4个段寄存器实现寻址1M字节物理地址空间
CS(代码段)放程序用
DS(数据段)放操作数据用
ES(附加段)经常和数据段同时使用
SS(堆栈段)放堆栈数(存,取数时)

6.控制寄存器(16位)
(1)指令指针
IP给出接着要执行的指令在代码段中的偏移(永远指向下一条指令)
(2)标志寄存器

15 14 13 12 11 10 9  8   7  6   5  4   3  2    1  0
            OF DF IF TF SF  ZF     AF     PF      CF

----运算结果标志----
进位标志CF 反映运算是否产生进位或借位(进位,借位。CF=1)

零标志ZF 反映运算结果是否为0(=0,ZF=1 else!=0,ZF=0)

符号标志SF 反映运算结果的符号位。SF与运算结果的最高位相同,最高位为

1,则SF=1,否则SF=0

溢出标志OF 反映有符号数加减运算是否引出溢出。8位(>127,<-128),16(

>32767,<-32768)符合范围为溢出,OF=1,否则OF=0

奇偶标志PF 反映运算结果中"1"的个数。偶数,PF=1。奇数,PF=0

辅助进位标志AF 低字节向高字节进位或借位时,AF=1,否则AF=0

----状态控制标志----
方向标志DF 串操作时
DF=1,串操作指令按<减>方式改变有关的存储器指针值(正方向)
DF=0,串操作指令按<加>方式改变有关的存储器指针值(负方向)

中断允许标志IF
决定着CPU是否响应外部可屏蔽中断请求
IF=1时,响应
IF=0时,不响应

追踪标志TF 用于程序调试
TF=1,CPU进入单步方式(指在一条指令执行后,产生一个单步中断)

7.存储单元的地址和内容
在存储器里以字节为单位存储信息。
每一个字节单元以一个存储器的地址。地址从0开始编号,顺序的每次加1。
字节单元(8位二进制数表示的字符)-->存储器地址(16位二进制数表示的

地址)
16位的二进制数可以表示2的16次(65536)方个字节单元
地址范围应该是0--65535
65536个字节单元的存储容器就是64K(64×1024)
地址编号的范围用16进制数表示为0--FFFFH

================我是无敌分割线=========================

终于把第3课看完了,短短40多分钟的课,我足足用了2个半小时才看完,我的天。寄存器这章太抽象啦,看完之后头晕晕的,并且还不是特别能够完全搞明白。还有各种问题啊,晕~~~~话说联系着后面的知识运用起来,这些就好理解了。。真的么??

哎。。。今天晚上绝对做噩梦。。。寄存器啊。。。。
2011-4-10 22:38
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
支持一下

作个记号

楼主请继续
2011-4-11 20:41
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢大家支持。。今天刚刚拿到王爽那本真书啊。激动啊,不过我想我还是先把中山大学的视频看完再去看那本书好了,视频直观点啊~
UP,UP!GO,GO,GO!~
2011-4-11 21:28
0
雪    币: 37
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这样学的啊。。。。
2011-4-11 22:28
0
雪    币: 5
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
很实用的东西,到破解的时候很多东西都是 1010111..这样去看规律的,特别是一些加密的数据!~基本上 都是同某个16进制数做异或。
2011-4-11 22:45
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
中山大学-4
1.字节存放信息
字节单元对应存放信息表示为:(字节单元)=信息
如4号字节单元存放的信息为34H表示为:(0004H)=34H

2.字存放信息
字单位的地址采用它的低地址来表示的(高位存入高地址,地位存入低地址


比如4号字单元的内容为1234H,表示为(0004H)=1234H
34H存在0004H中(低位)   12H则存在0005H中(高位)

3.双字存放信息
同字存放信息

4.(0004H)=1234H
  (1234H)=1A12H
so:((0004))=1A12H

5.存储器地址的分段和物理地址的形成
16位字长的机器可以访问最大的存储空间为64K字节
而8086/8088CPU有20根地址线,可直接寻址的物理地址空间为1M(2的20次方

)。所以要访问1M字节空间的存储器必须有20位地址。用16进制数表示1M字

节的地址范围为00000--FFFFF。
在16位字长的机器里,用存储器地址 分段的方法。
程序员在编制程序时要把存储器划分成段,每个段的大小可达64K,这样段内

地址可以用16位表示。
段与段之间可以相连,也可以不相连,还可以部分重叠。
段的起始地址有所限制,段不能起始于任意地址,而必须从任一小段的首地

址开始。
机器规定:从0地址开始,每16个字节为一小段(16的倍数)
000'0'0,00001,00002,...,0000E,0000F;0为第1小段
000'1'0,00011,00012,...,0001E,0001F;1为第2小段
...
第一列就是每个小段的首地址,其特征是:在16进制表示的地址中,最低为0

(即20位地址的低4位为0)如:0000'0'H,0001'0'H,

0002'0'H...4233'0'H...FFFE'0'H,FFFF'0'H
在1M字节的存储器里,每一个存储单元都有一个唯一的20地址,称为该存储

单元的物理地址。
要先确定存储单元的物理地址才能取得(或存入)该单元中的内容,访问的

某一个存储单元总是输入某个段。
把存储单元的地址与所在段的起始地址的差称为段内便宜,简称为偏移。
在1M地址空间中,存储单元的物理地址等于段起始地址加上偏移。
存储单元的逻辑地址由:段值和偏移2部分组成。表示为:段值:偏移
物理地址=段值×16+偏移
比如:用16进制表示的逻辑地址1234:3456所对应的存储单元的物理地址为:
物理地址=12340+3456=15796H
由于段可以重叠,所以一个物理地址可以用多个逻辑地址表示。
10020H----------------
                        2325H
12330H----------------
                        15H
12345H----------------

存储单元的物理地址是12345H
两个重叠段的段值分别是:1002H和1233H
在对应段内的偏移分别是2325H和0015H

所以12345H=1002(0)H+2325H或者12345H=1233(0)H+0015H
           1002:2325                1233:0015
逻辑地址不同,但是物理地址相同

段值由段寄存器给出,偏移可由指令指针IP,堆栈指针SP和其他可作为存储

器指针使用的寄存器(SI,DI,BX和BP)给出,偏移还可直接用16位数给出

。指令中不使用物理地址,而是使用逻辑地址,由总线接口单元BIU按需要根

据段值和偏移自动形成20位物理地址。

6.段存储器的引用
在取指令的时候,自动引用代码段寄存器CS,再加上由IP给出的16位偏移,

得到要取的指令物理地址。(得到执行指令的顺序)
当涉及到一个堆栈操作时,则自动引用堆栈寄存器SS,再加上由SP所给出的

16位偏移,得到堆栈操作所需要的物理地址。
当偏移涉及BP寄存器时,缺省引用段寄存器SS
在存取一个普通存储器操作数时,则自动选择数据寄存器DS或附加段寄存器

ES,再加上16位偏移,得到存储器操作数的物理地址
每个存储单元只有唯一的物理地址,但它却可由不同的段地址和不同的偏移

地址组成。

================我是无敌分割线=========================

第4课依然难懂,依然抽象啊。看的我。。。

好好复习,好好消化下先。。。有没有高人关注我的帖子的?

问个问题:视频里面有个公式:物理地址=段值×16+偏移
这个×16是什么意思啊?应该是在段值后加0撒,因为首地址一定为0啊。
难道这货单纯表示段值是以16位二进制表示的?
这个×16确实让我纠结了好半天。。
2011-4-11 22:53
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
个人学习方式。。。哈哈,优缺自视啦~~~

求分享下学习经验撒
2011-4-11 22:56
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
个人觉得 王爽+中山汇编这2样也还不够 - -(2样我都看过)里面还有些知识讲解还是不够详细,还需要以前的那本8086汇编书。3样一起学更好些。这3种都各有所长,各有所短

   同是小白的感受 - -
2011-4-11 23:29
0
雪    币: 265
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
赞下楼主的分享精神!
2011-4-12 08:55
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
中山大学-5
1.16进制数的最高位为字母,则应在其前加一个0.如:0A7F0H

2.8086/8088的寻址方式
计算机中的指令由操作码字段和操作数字段两部分组成。
汇编语言是一种符号语言,它用助记符来表示操作码,用符号或符号地址来

表示操作数或操作数地址。它与机器指令一一对应的。

Eg:ADD AX,BX    AX为目的操作数,BX为源操作数

8086/8088有7种基本寻址方式:
(1)立即寻址方式
操作数就包含在指令中,它作为指令的一部分,跟在【操作码】后存放在【

代码段】,这种操作数称为立即数。可以为8位或16位的。
Eg:指令:MOV AL,5  执行指令后(AL)=05H
    指令:MOV BX,3064H  执行指令后(BX)=3064H
寄存器必须对应操作数的位数(8位对8位,16位对16位)
(2)寄存器寻址方式
操作数在CPU内部的寄存器中,指令制定寄存器号。
对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP,BP等
对于8位操作数,寄存器可以是AL,AH,BL,BH,CL,CH,DL,DH
这种寻址方式由于操作数在寄存器中,不需要访问存储器来取得操作数,因

而可以缺的较高的运算速度。
Eg:指令   MOV AX,BX
如指令执行前(AX)=3064H(BX)=1234H,则指令执行后
(AX)=1234H,(BX)保持不变
注意:8位寄存器对应8位,16位寄存器对应16位。不能8位对16位,或者16位

对8位的错位指令
(3)直接寻址方式
操作数在寄存器中,指令直接包含有操作数的有效地址(偏移地址)。操作

数一般放在数据段中,所以操作数的地址由DS加上指令中直接给出的16位偏

移得到。特殊情况(采用段超越前缀),操作数也可包含在数据段外的其它

段中。
Eg:指令  MOV AX,[8054]
如(DS)=2000H,则执行结果为:(AX)=3050H
(28054H上的内容为50,28055H上的内容为30)
物理地址=20000+8054=28054H

在汇编语言指令中,可以用符号地址代替数值地址,如:MOV AX,VALUE
此时VALUE为存放操作数单元的符号地址。如写成:MOV AX,[VALUE]
两者是等效的。

如VALUE在附加段中,则应制定段超越前缀如下:
MOV AX,ES:VALUE  或者  MOV AX,ES:[VALUE]
因为是附加段(ES),所以段超越前缀为ES:

直接寻址方式常用于处理单个存储器变量的情况。它可实现在64K字节的段内

寻找操作数。直接寻址的操作数通常是程序使用的变量。
注意立即寻址和直接寻址书写表示方法上的不同,直接寻址的地址要放在[]

中,在源程序中,往往用变量名表示。
(4)寄存器间接寻址方式
操作数在存储器中,操作数有效地址在SI,DI,BX,BP这4个寄存器之一中。

在一般情况下:
如果有效地址在SI,DI和BX中,则以DS段寄存器之内容为段值。
如果有效地址在BP中,则以SS段寄存器之内容为段值。
Eg:MOV AX,[SI]如果(DS)=5000H,(SI)=1234H  
则物理地址=50000+1234=51234H,则执行该指令后(AX)=6789H
指令中也可指定段超越前缀来取得其他段中的数据:
MOV AX,ES:[BX]   引用的段寄存器是ES
MOV [SI],AX    目的操作数寄存器间接寻址
MOV [BP],CX    引用的段寄存器是SS
MOV SI,AX      目的操作数寄存器寻址
(5)寄存器相对寻址方式
操作数在存储器中,操作的有效地址是一个基址寄存器(BX,BP)或变址寄

存器的(SI,DI)内容加上指令中给定的8位或16位位移量之和。
EA(有效地址)=(BX)或(BP)或(SI)或(DI)+8位位移量或者16位位移


在一般情况下:
如果有效地址在SI,DI和BX中,则以DS段寄存器之内容为段值。
如果有效地址在BP中,则以SS段寄存器之内容为段值。
物理地址=16d×(DS)+(BX)或(SI)或(DI)+8位位移量或者16位位移量
物理地址=16d×(SS)+(BP)+8位位移量或者16位位移量
在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如

位移量是8位,则被带符号扩展成16位
Eg:MOV AX,[DI+1223H]
假如,(DS)=5000H,  (DI)=3678H
则物理地址50000+3678+1223=5489BH
则(AX)=55AAH
5489BH上的内容是AA(对应AL),5489CH的内容是55(对应AH)
源操作数采用寄存器相对寻址,引用段寄存器是SS:MOV BX,[BP-4]
目的操作数采用寄存器相对寻址,引用段寄存器是ES:MOV ES:[BX+5],AL
指令:MOV AX,[SI+3]与MOV AX,3[SI]是等价的

================我是无敌分割线=========================

第5章都比第3,4张好搞啊。。感觉听起还是蛮有感觉的,虽然有些地方还是没有搞定,慢慢搞吧~~~顺便求高人解决几个问题:
1.直接寻址方式中,可以用符号地址代替数值地址。
在百度里面查了下符号地址,如是解释:符号地址是数值地址符号化后的地址,它相当于偏移地址;
符号化的意思是不是它会有正负,可以是向前偏移,也可以向后偏移????
这样的话是不是就可以表示成[4233H]或者[-4233H]呢??
2.目的操作数采用寄存器相对寻址,引用段寄存器是DS:MOV [BX+1000H],AL

这时的运算方式是不是和源操作数采用寄存器相对寻址时的一样呢???

比如(DS)=1000H,(BX)=1500H,(AL)=20H

物理地址=10000+1500+1000=12500H

BX+1000H=AL

这样对么?????

谢谢疯狂P崽的提醒哈,没有注意~~
2011-4-12 22:13
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我是个可怜的娃啊。。。求帮忙啊,各位在线的大神。。。帮下忙,解决下新人的难题嘛
2011-4-12 22:20
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
21
贴子的格式太好,什么问题呀
2011-4-12 22:28
0
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
偏移地址一般向前不向后
还有LZ,AL不会 =2000H的,它是8位的也,最多20H
2011-4-12 23:27
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
中山大学的视频没用,都没有零基础学习的。。建议你看王爽的汇编书
2011-4-12 23:37
0
雪    币: 278
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
过来学习的
2011-4-13 00:03
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
在每篇日志最后,我都会提出我在学习过程中产生的问题。。字有点多,不太容易注意。。下次改进哈~~~~

麻烦大神解答下小弟这些对你们来说比较简单的问题拉~~谢谢~
2011-4-13 09:43
0
游客
登录 | 注册 方可回帖
返回
//