您的位置:首页 > 其它

随想汇编语言阶段性总结

2013-01-24 22:36 399 查看
2013年1月24日

花了两个月的时间来学习于渊的《自己动手写操作系统》,开始深深地被吸引了。写操作系统,呵!多伟大的事!此书用汇编语言,nasm来一步步实现。

现在看了此书的前三章,到保护模式的中断结束。我打算好好总结一下前三章,当然要配合李忠的《X86汇编语言,从实模式到保护模式》一书。

通过前三章的学习,我总结如下:

一.忽略次要问题,重视主线,主线就是于渊的《自己动手写操作系统》一书。一定要围绕着此书开展学习和查找资料,否则要迷失方向。要自己铭记无论怎样查找资料的范围,最终都要回到 《自己动手写操作系统》上来。

二.连基础的汇编语言的语法不了解透,很难看懂(花几天时间,花几晚上,熬夜,反复找教材的指令语法)一段源码,看不懂得是语法,而还不是数据结构,比如:串操作指令,div 指令,溢出(OF), 进位(CF),MUL乘法指令。再比如,负数的表示范围,CMP比较指令的用法,TEST指令的用法。什么是特权指令(我现在理解是RING0的指令,不知对不对?呵!)等,还有堆栈,当然还包括很多。所有以上提的这些都 是实模式的内容。所以,一定要搞懂基本指令语法,和实模式的基本内容,否则,剩下的章节很不容易进行下去

(就像前三章一样进行的很痛苦,我只能用痛苦来形容,痛病快了着,呵)。

现在用李忠先生的《x86汇编语言,从实模式到保护模式》一书,学习汇编语言的基础知识

读书笔记如下:

 
第6章 相同的功能,不同的代码

 

           6.7 计算机中的负数 (p81)

 

                 此节中的负数就是补码表示法(当然还有原码,反码表示法)

 

                 8位二进制数表示范围:最高位0表示正数,1表示负数

 

                                                    正数:00000000---->01111111      0------->127

 

                                                    负数:10000000----->11111111    -128------>-1

 

                                                     负数的值范围这样运算:  0减去一个负数等于该负数的正数,给正数加-符号,就是负数。

 

                                                                                           00000000 - 10000000=10000000 得正数128,-128 就是10000000负数数值

 

                                                                                           00000000 - 11111111=00000001 得正数   1, -1     就是11111111负数数值

 

                                                   neg   操作数                     (操作数)< ----0-(操作数)

 

                                                          neg al    ;如al=00001000 (十进制8),执行该指令后,0-8=-8 即:00000000-00001000=11111000 ,(al)=-8

 

                                                          不可对照11111000 计算负值(这是错误的),换句话:11111000是-8的计算机的二进制表示法。

 

                                                         neg dx

 

                                                         neg word [label_a]

 

                                                        以上两个指令同理。

 

 

 

                                                   将 一个8位(或16位)的有符号数扩展到16位(或32位)时,只需将其最高位(符号位),扩展到8位(或16位)即可

 

                                                    cbw 指令:将AL中的有符号数扩展到整个AX中

 

                                                    cwd指令: 将AX中的有符号数扩展到Dx

                                                    movsb 指令

                                                    movsw 指令

                                                    ds:si 源

                                                    es:di 目的

 

                                                    flag

                                                    carry     借位

                                                    direction 方向

                                                    trap 陷阱

                                                   zero

                                                   overflow 溢出

 

                                                   div 指令 (无符号)

                                                   idiv 指令  (有符号)

                                                   ax 和dx:ax 为被除数

                                                   al ,ax  :商

                                                   ah,dx:余数

                                                   两指令对条件码不影响

 

                                                   

 

                                                  cwb 符号扩展位

                                                  cwd 符号扩展位

 

                                                cmp 比较指令(具体见书p91)

                                              

                                                条件转移指令

 

 

 

 

第七章    比高斯更快的计算  2013年1月26日

              adc 指令

              8086 寻址方式,寻址方式是由硬件电路决定的(我的猜测)

             loop 指令:先cx 减一,再判断cx,决定是否进入循环体

             堆栈操作

             $:  当前指令的汇编地址

            

             

                                               
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: