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,决定是否进入循环体
堆栈操作
$: 当前指令的汇编地址