(纯新人)汇编学习难点记录 ---0001H
以下内容是最近学习王爽老师的汇编语言的1-2章(1章全部,2章部分)的难点与心得总结性记录写在前面:数据后加“H”表示为16进制,数字后加“B”表示2进制,后面什么也不加表示十进制。1、汇编指令是程序员所写,一般为英文形式,而计算机会通过汇编编译器将其转化为二进制机械码,再将其应用。
如图:
2、指令与数据在储存器中并无不同,均是以二进制码的形式储存。
3、CPU利用储存线(一共叫地址总线)传输二进制数实现对数据储存位置的选择,例如有8根储存线的CPU将最多可输出从0~2^8=255(0~255)的位置选择。同理16根线的CPU可以选择0~2^16=65535的地址选择。
4、CPU通过数据线(一共叫数据总线)传输储存数据,一个字节用8根线传输,即:如8088CPU的数据总线为8根,则一次传输数据大小为1B,欲传输数据为89D8H时,需要分两次(第一次传输89H。第二次传输D8H)。
5、CPU还有控制总线来实现对其他外部器件的控制。
5、储存器分为ROM(只读储存器)与RAM(随机储存器)两种,我们进行数据写入的是RAM,也就是我们叫内存、显存的那玩意儿,而ROM基本用于BIOS(basic Input/Output System基本输入/输出系统)。
一般逻辑结构如下图:
而对于我们写程序时的内存地址而言,是以下逻辑结构:
以下一段话暂时理解不透彻,但并不影响学习,日后学完回头再来看一次。
6、寄存器:CPU内部的储存数据的结构;
对于8086CPU 而言,其寄存器均为16位,每个可以存放2个字节,8086CPU中有AX、BX、CX、DX四个16位寄存器,但其上一代CPU中寄存器却只有8位,为了兼容上一代CPU的程序,8086CPU的每个寄存器均可分为两个8位寄存器。
16位寄存器中每位从右向左编号为0-15,每位可传输1位二进制数,16位分为2个8位寄存器的原理为,按照位次高低分,0-7为低位,分为8位寄存器称为AL(大概是AX的low的缩写吧?),与之对应的8~15为AH。
同理BX,CX,DX也可分为BH,BL,CH,CL,DH,DL.
看图理解:
。
同时因为16位寄存器分为两个8位寄存器,所以期中储存的数据的最大值也会因此而缩小2^8,例如下图:
(注:在AX的寄存器内的数据表中只有15位,最前应如AH中,还有0,总值应为0100111000100000)
7、几条汇编指令
注意:
0)汇编语言不区分大小写;
1)汇编指令中可以自行分割AL、AH,将其作为一个单独的寄存器使用;
2)在运算过程中,如果运算完后的数据大小超出寄存器的大小例如,8位寄存器计算后出现3位的十六进制数,则会将最高位的数“舍去”(这儿指的是不显示,据说不会真正的丢弃);
3)在使用汇编指令时,应当确保寄存器的位数相同,即均为16位或者8位,不可交叉使用。(原因应该是位数不同会导致上一点的高位“舍去”)。
PS:正确例:
错误例:
8、16位的CPU意味着其内部的处理是以十六位进行,并具有如下一些结构特性:
简而言之:其内部以十六位数进行储存以及数据传输(与寄存器的概念相结合,其与内存的20条或者32条数据线可不匹配,与下一个点相结合)。
9、(与上一个点结合)8086CPU给出物理地址的方式
8086CPU为十六位CPU,其内部一次性处理、传输、储存,但其地址总线中共有20根地址线,即其储存地址大小最大为2^20,如果只使用16位会造成大量的损失,于是可以用两个16位地址合成20位地址的方法。
具体方法书上解释如下
换我理解就是,第一次十六位地址传输的数据大小在内部*16+第二次的数据
因为是16进制,所以*16会让第一段的地址末尾加上一个0,即类似于在十进制中扩大十倍一样。
如需要输出123C8时,因为16位只能输出4位16进制数,所以需要使用此方法,具体流程如下:
如此便得到了一个本来不能表示的十六进制数。
10、展开思考有关数据左移的本质
观察此表
这是2进制在末尾添“0”的方法,
10进制与16进制就是分别“*10”以及“*16”;
即X进制欲末尾添n个“0”(数据左移n位)
需要乘以X^n。
套用一个老师的例子,你现在需要给你朋友写一个四位数,然而现在你手上两张纸每一张只足够你写三位的数,那么你怎样传给你朋友这个四位数呢?
很简单,你将其中三个写在第一张纸上,剩下一个写在第二张纸上,作为人,你自己的思维里很自然的将第一张纸上的数扩大了十倍,然而计算机却需要将第一个数“*10”后再相加,这就是这个左移的本质。
(本次完)
大佬太厉害了 想学但是看不懂啊! 感谢大佬分享经验,希望好贴继续!!! 看过编译原理,晦涩难懂,楼主加油 虽然没看懂,但知道你很牛! 过来学习了,共同进步~ 同样在学,一起努力把! 楼主你成功引起了我的关注,我成了你第一个听众。
页:
[1]
2