曲曲的秘密学术基地

纯化欲望、坚持严肃性

欢迎!我是曲泽慧(@zququ),目前在深圳(ICBI,BCBDI,SIAT)任职助理研究员。


病毒学、免疫学及结构生物学背景,可以在 RG 上找到我已发表的论文

本站自2019年7月已访问web counter

汇编语言 寄存器总结 (转载)

转自CSDN博客,Dask Jhonson
转自CSDN博客,iteye_10501

表格总结:

寄存器的分类   寄存器 主要用途
通用寄存器 数据寄存器 AX 乘、除运算,字的输入输出,中间结果的缓存
    AL 字节的乘、除运算,字节的输入输出,十进制算数运算
    AH 字节的乘、除运算,存放中断的功能号
    BX 存储器指针
    CX 串操作、循环控制的计数器
    CL 移位操作的计数器
    DX 字的乘、除运算,间接的输入输出
  变址寄存器 SI 存储器指针、串指令中的源操作数指针
    DI 存储器指针、串指令中的目的操作数指针
    BP 存储器指针、存取堆栈的指针
    SP 堆栈的栈顶指针
指令指针   IP/EIP  
标志位寄存器   FLag/EFlag  
32位CPU的段寄存器 16位CPU的段寄存器 ES 附加段寄存器
    CS 代码段寄存器
    SS 堆栈段寄存器
    DS 数据段寄存器
  新增加的段寄存器 FS 附加段寄存器
    GS 附加段寄存器

8086CPU总共有14个寄存器:
即AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES共14个。

1. 通用寄存器

AX,BX,CX,DX称作为数据寄存器

AX (Accumulator):累加寄存器,也称之为累加器;
BX (Base):基地址寄存器;
CX (Count):计数器寄存器;
DX (Data):数据寄存器;

SP和BP又称作为指针寄存器

SP (Stack Pointer):堆栈指针寄存器;
BP (Base Pointer):基指针寄存器;

SI和DI又称作为变址寄存器

SI (Source Index):源变址寄存器;
DI (Destination Index):目的贬值寄存器;

2. 控制寄存器

IP (Instruction Pointer):指令指针寄存器; FLAG:标志寄存器;

3. 段寄存器

CS (Code Segment):代码段寄存器;
DS (Data Segment):数据段寄存器;
SS (Stack Segment):堆栈段寄存器;
ES (Extra Segment):附加段寄存器;

以上是常见的寄存器分类;其终值得注意的每个寄存器都是16位的(dword,双字节),而只有4个数据寄存器,即AX,BX,CX,DX可以拆分为两个8位寄存器来使用

寄存器使用方法

1. 4个数据寄存器是可拆分的

例如AX可分为AH(高位寄存器)和AL(低位寄存器),即:在负值的时候可分开赋值。

2. CS/IP寄存器

CS:IP 索引的内存即为CPU开始读取代码的起点,之后的一段代码区域,被称为代码片段(code segment),这两个寄存器不能进行赋值操作(mov操作),只能通过jmp指令跳转。

jmp 4E6A:0

3. SS/SP

用于栈顶操作

4. segment(段)

  1. 数据段(被存在DS指定的段地址开始的地方)
  2. 代码段(被存在CS指定的段地址开始的地方)
  3. 栈段(被存在SS指定的段地址开始的地方)

一般通过assume伪指令把数据段绑定在对应的段上,

assume cs:code, ds:data, ss:stack

5. 寄存器寻址

(1) 在8086CPU中只有这四个寄存器可以在[…]中进行内存单元的寻址。

比如,下面的指令都是正确的:
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]

而下面都是错误的: mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]

(2) 在[…]中,这四个寄存器可以单独出现,或者只能以四种组合出现:bx和si、bx和di、bp和si、bp和di。

比如下面都是正确的:
mov ax,[bx]
mov ax,[si]
mov ax,[di]
mov ax,[bp]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mpv ax,[bp+di]
mov ax,[bx+si+idata]
mov ax,[bx+si+idata]
mov ax,[bp+si+idata]
mov ax,[bp+di+idata]

下面就是错误的:
mov ax,[bx+bp]
mov ax,[si+di]

(3) 只要在[…]中使用寄存器bp,而指令汇总没有显示给出段地址,段地址就默认在ss中。 比如下面的指令:

mov ax,[bp] 含义:(ax)=((ss)*16+(bp))
mov ax,[bp+idata] 含义:(ax)=((ss)*16+(bp)+idata)
mov ax,[bp+si] 含义:(ax)=((ss)*16+(bp)+(si))
mov ax,[bp+si+idata] 含义:(ax)=((ss)*16+(bp)+(si)+idata)

Last One

python 魔法方法 (7) 定制序列

整理自小甲鱼鱼C论坛定制容器与协议(protocol)成功地实现容器定制,需要先了解一下协议(protocol)。Python中的协议与其他编程语言中的接口很相似,它规定哪些方法必须定义。然后,在Python中的协议就不那么正式。事实上,Python的协议更像是一种指南。这有点像Python极力推崇的鸭子类型。鸭子类型(duck typing)复习鸭子类型(duck typing)是动态类型的一种风格。这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属...…

pythonMore
Next One

汇编语言 实验10 (2) 解决除法溢出的问题

div 复习div指令可以做除法。当进行8位除法的时候,用al存储结果的商,ah存储结果的余数;进行16位除法的时候,用ax存储结果的商,dx存储结果的余数, 数据类型 寄存器 存放内容 8位 al 商   ah 余数 16位 ax 商   dx 余数 ...…

汇编语言More