• 汇编第一日


    本文汇编主要针对的是8086CPU

    计算机中三条主要总线:地址总线控制总线数据总线,从CPU管脚引出

    32位,64位CPU一次存取数据大小为32位,64位内存存储单元大小为8bit = 1byte

    振荡器振荡产生高低电平,高电平为1,低电平为0,CPU只认1和0

    每种CPU架构(x86(CISC,主要在电脑上),MIPS(RISC,主要在嵌入式上),ARM(RISC,主要在手机))都有自己汇编指令集

    存储器中存着指令和数据,根据将其放在哪种总线上传输而将其区分

    CPU并不直接控制外部硬件设备,而由扩展插槽上接口卡控制外部硬件设备

    CPU主要有运算器控制器寄存器组成

    x86CPU架构发展  8088(8位)-> 8086(16位,地址线20条) -> 80286(16位,地址线24条) -> 80386(i386 , 32位,地址线32条) -> 80486  -> 奔腾  ->core (i3,i5,i7)

    8086CPU中寄存器为16位,可以存放两个字节(1个

    16位寄存器最大存放数据为(2^16) - 1

    一个字为16bit,也为2字节

    mov  ax, bx     含义:bx数据赋值给ax

    通用寄存器:ax,bx,cx,dx,现在为eax,ebx.......

    在8086种寄存器为16位,而8088种为8位,为了兼容,8086寄存器ax 分成 ah(保存高8位数据) 和 al (低8位数据)

    16位CPU:

    运算器一次最多处理16位数据

    寄存器最大数据宽度为16位

    寄存器和运算器之间通路宽度为16位

    地址总线宽度16位

    8086CPU:

    地址线为20根:最大寻址空间为 2 ^ 20 = 1MB

    但是16位数据最大寻址空间为 2 ^ 16 = 64KB

    出现了段地址偏移地址

    16位段地址和偏移地址如何形成20位物理地址?

    物理地址 = 段地址 << 4 + 偏移地址

    段地址 << 4 : 在十六进制下,在数据末尾加上0即可

    偏移地址:16位,所以导致段大小为 2 ^ 16 = 64KB(0   -   ffffH)

    但是注意:

    分段仅仅由CPU内部划分,内存实际上并没有被划分成段

    21F60 = 2000H << 4 + 1F60H = 2100H << 4 + 0F60H

    说明了CPU可用不同的cs:ip得到相同的物理地址

    段寄存器提供段地址:CS(代码),DS(数据),SS(堆栈),ES(前面不够使用该寄存器)

    改变CS:IP可以按自己意愿执行:

    1.对于CS和IP修改只能用jmp指令:

    jmp 2AE3:3     ->    2AE33

    jmp 3:0B16     ->    0003 << 4 + 0B16 = 00B46

    2.若只想变IP:

    jmp 200H    在含义上等同于 mov ip  200H  但是实际上不能这样写

    对于16进制数据如 4E20H   4E为高位,  20为低位,而且4E占了8bit,等同于一个内存存储单元,存放情况:

    任何两个连续内存单元N号和N+1号,可以将其看成一个地址为N的字单元中高位字节单元和低位字节单元

    DS用来存放要访问数据的段地址

    mov功能:

    数据  ->  寄存器

    寄存器 -> 寄存器

    内存中单元内容   ->  寄存器

    数据  -> 内存单元    等等。。。。

    mov  ds  1000H  

    该语句错误,x86CPU不支持数据段寄存器,只支持寄存器段寄存器

    所以可写:

    mov ax, 2000H

    mov ds, ax

    内存存储单元到寄存器:

    mov bx, 1000H

    mov ds, bx

    mov ax, [0]  //传过去1000(ds寄存器保存的段地址):0型数据,16位对应ax寄存器存放的16位

    mov [1],bx//bx16位数据传到1000:0处

    例如:

    执行指令后ax为3C2E(由于传过去16位,所以10001和10000,注意高位地址对应高位数据),同时10002H内容为00,10003H为10

    如果mov  al [0]  把ds:0对应的内存存储单元(8位)传到al,因为al大小为8位,传数据的大小由传入对象大小决定

    add/sub ds, ax  不可以 

    add  ax bx  含义为:ax = ax + bx  (内容先加)

                                        Done!!!

  • 相关阅读:
    马士兵Java学习之路
    @Component, @Repository, @Service的区别
    编译器警告:CGContextSaveGState: invalid context 0x0
    Other Linker Flags到底是什么
    Xcode常用快捷键(持续更新-20160811)
    iOS应用文件夹
    iOS compare 字符串比较
    去掉UITableView多余的空白行分割线
    iOS 查询数组中的对象
    UISearchController使用
  • 原文地址:https://www.cnblogs.com/chaunceyctx/p/7260827.html
Copyright © 2020-2023  润新知