初学汇编

此文总结第一、二、三单元所学。

因为前几节课没有去上,所以第一单元我可能不能非常正确地去总结,尽量按着老师的课件来看下去。

summary

Chap. I BASIS

第一章都是计算机基础,或者可以说计算机组成原理的超级简略版?

机器语言

silly binaries

计算机可以直接识别、执行。不是给人写的东西。

不同种类的计算机其机器语言是不相通的,按某种计算机的机器指令编制的程序不能在另一种计算机上执行。

汇编语言

silly string replacer

主体是汇编指令,使用助记符便于人记忆和使用。

机械语言是机械指令的集合,汇编语言是机械指令符号化。

每一种特定的汇编语言和其特定的机器语言指令集是一一对应的。(通用性还是较低)

计算机系统

有时间还是看看计算机组成原理吧。

存储器 存储单元

总线

还是叫成bus 直观。

如果说主板是一座城市,那么总线就像是城市里的公共汽车(bus),能按照固定行车路线,传输来回不停运作的比特。这些线路在同一时间内都仅能负责传输一个比特。因此,必须同时采用多条线路才能发送更多数据,而总线可同时传输的数据数就称为宽度,以比特为单位,总线宽度愈大,传输性能就愈佳。

PC上一般有五种总线*

  1. 数据总线:在CPU与RAM之间来回传送需要处理或是需要储存的数据。
  2. 地址总线:用来指定在RAM(Random Access Memory)之中储存的数据的地址。
  3. 控制总线:将微处理器控制单元(Control Unit)的信号,传送到周边设备,一般常见的为USB Bus和1394 Bus。
  4. 扩展总线:可连接扩展槽和计算机。
  5. 局部总线:取代更高速数据传输的扩展总线。

* Wikipedia 上说总线有五种,课本上只有前三种。

内存地址空间

虚拟地址空间?

现代的内存管理单元是以页的方式,分割虚拟地址空间的。通过总线,CPU将各类存储器当做一个逻辑存储器对待。

感觉类似于把各个存储器mount 到地址空间上,使其拥有一个唯一的地址(路径)。

Chap. II REGISTER

summery

寄存器

快 少 在CPU里

From https://en.wikipedia.org/wiki/Intel_8086

字长 位宽

字长:CPU在单位时间内能一次处理的二进制位数,反映出CPU内部运算处理的速度。

位宽:CPU通过外部数据总线与内存之间一次能够传送的数据位。

大概就是高速公路收费站高速公路车道数的关系吧。

main registers

Four of them, AX, BX, CX, DX, can also be accessed as twice as many 8-bit registers.

4个:ax, bx, cx, dx

亦可使用ah, al 访问通用寄存器的高位和低位。

感觉main registers 翻译成通用寄存器怪怪的。

cs & ip

课本的编排是真的乱七八糟。

为什么第二章PPT第12页上说8086CPU的位宽是16位?

8086 数据总线16位, 地址总线 20位。

There are also three 16-bit segment registers (see figure) that allow the 8086 CPU to access one megabyte of memory in an unusual way. Rather than concatenating the segment register with the address register, as in most processors whose address space exceeds their register size, the 8086 shifts the 16-bit segment only four bits left before adding it to the 16-bit offset (16×segment + offset), therefore producing a 20-bit external (or effective or physical) address from the 32-bit segment:offset pair. As a result, each external address can be referred to by 212 = 4096 different segment:offset pairs.

也就是用

segment * 0x10  + offset = address

来实现1MB的寻址。

 

同时修改 cs ip

jmp segment:offset

jmp segment:offset

jmp segment:offset

只修改 ip

jmp register

jmp register

jmp register

不能用 mov ip, ax ,重要的事情说三遍

debug

常用指令

没啥好说的,有问题就敲?

  • Register
    查看寄存器
  • Dump
    查看内存
  • Enter
    修改内存
  • Unassemble
    反汇编
  • Trace
    单步执行
  • Assemble
    编写汇编

etc & idea

真的还是挺不错的一个解决方法。

因为我不使用Windows,所以这里有一份我自己写的Ubuntu下安装模拟环境的博文:[lip id=”530″]

在我学习汇编之前,就已经了解到了一个不错的C/C++反汇编工具 —— [lip id=”207″]。喜欢的可以试一试。

references

  1. https://en.wikipedia.org/wiki/Intel_8086
  2. http://www.cnblogs.com/zyx20171346065/p/9696999.html
  3. https://zh.wikipedia.org/wiki/%E6%80%BB%E7%BA%BF
  4. https://en.wikipedia.org/wiki/Memory_address
  5. https://www.youtube.com/watch?v=yoLMOsxXgFw
  6. https://en.wikipedia.org/wiki/Word_(computer_architecture)

 

CC BY-NC-SA 4.0 本作品使用基于以下许可授权:Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注