美文网首页
汇编语言学习笔记-仅供个人

汇编语言学习笔记-仅供个人

作者: BohrIsLay | 来源:发表于2017-07-11 18:05 被阅读57次

    汇编语言

    • 汇编指令
      通过编译器可以将汇编指令翻译成机器指令
    • 伪指令
      告诉翻译软件,也就是编译器,这里怎么翻译,那里怎么翻译,由编译器执行,没有对应的机器指令
    • 符号体系
      +-*/ 没有对应的机器执行,由编译器执行

    基本知识

    • 1.什么是机器指令?
      0101010101010101的二进制数字
    • 2.二进制和机器语言(机器指令的集合)的关系?
      二进制可以描述这个机器指令
    • 3.机器指令和汇编指令的关系?
      通过编译器可以直接翻译 一一对应
    • 4.计算机哪个部件,执行机器指令?
      CPU

    机器指令存放的地方

    CPU 通过指令来控制整个计算机的
    指令和数据
    计算机有很多部件,它们都是进行分工的

    内存
    CPU在工作时,需要对指令和数据进行区分

    指令和数据是以什么形式存放在内存中的
    以二进制形式存放在内存中的(为方便看,翻译成16进制)

    255 -> FFH 1111 1111

    本节课重点内存
    内存也叫做存储单元
    内存的最小单位字节Byte - 8个二进制数字 bit 比特 - 2个16进制数字
    1Byte = 8bit
    44H
    0100 0100
    对字节(存储单元)进行编号
    它们是从零开始编号的

    • 1.机器指令(汇编指令)和数据存放在哪里?
      内存中
    • 2.机器指令(汇编指令)和数据是以什么形式存在的?
    • 3.内存(存储编号)是怎么计算的?
      从零开始
    • 4.内存的计量单位
      1Byte = 8bit
      1KB = 1024Byte
      1MB = 1024KB
      1GB = 1024MB
      1TB = 1024GB

    2进制存放(16进制表示)

    内存条只是内存的一部分,计算机很多部件都有内存

    2进制和内存的关系

    内存编号
    0 1 2 3 4
    CPU 和内存发生联系需要:
    内存编号的信息
    数据信息
    控制信息
    我们将描述地址的信号称为地址线:0 或1
    地址线的数量决定了能够表示多少个地址
    假设我有n根地址线,我就能够寻找到 2的n次方个地址(字节)
    10根地址线
    0 - 1023
    0 - (2的n次方 - 1)

    • 1.内存单元为什么从0开始编号?
    • 2.什么叫做地址线?
      地址线决定CPU可以寻找到多少个地址(2 的n次方)

    地址线,数据线,控制线

    数据线 0 或者1
    1Byte = 1bit

    控制线
    控制线决定了CPU能够对哪些部件进行控制
    读写

    CPU通过地址线,数据线,控制线和内存打交道

      1. 1个CPU的寻址能力为8kb, 那么它额地址总线宽度为? 13
      1. 1kB的存储器有?存储单元,存储单元的编号从?到? 1024, 0 ,1023
    • 3.1KB的存储单元可以存储?bit, ?Byte
      1KB = 1024Byte
      1Byte = 8bit

    加深对内存的认识

    显存 往显存里写东西,会控制显示的输出

    ROM和RAM
    ROM只允许读取, 不通电的情况下里面的数据还是保存的
    RAM,允许读取和写入, 电没了就没了

    CPU通过内存编号的读写,然后控制部件
    CPU将所有部件看成内存地址

    CPU存储地址信息和数据信息的地方

    寄存器
    我们汇编程序员就是通过汇编指令来修改寄存器中的内容 来控cpu
    AX, BX, CX,DX
    通用寄存器 一般存放数据
    FFFFH 2Byte = 16bit 0 ~65535 即0~(2^16 - 1)
    mov ax, 40H 将指令40H放到寄存器ax中
    AX = AH + AL H = high 高 L = low 低
    BX = BH + BL
    CX = CH + CL
    DX = DH + DL
    AH 和AL 等等,都是独立的寄存器 2^8 - 1

    加深AX,BX,CX,DX寄存器的印象

    mov ax, 18H
    mov ah, 78H
    add ax, 8H
    mov bx, ax
    add ax, bx

    AX = 0018H
    AX = 7818H
    AX = 7820H
    BX = 7820H
    AX = F040H

    mov ax, 100000H 会报错,超过最大值FFFFH
    mov al, 256H会报错,超过最大值255
    add 不会报错,只会截取4位16进制放到ax中,其他的放在别的地方
    mov ax, bl 报错, 一个是16位寄存器,一个8位寄存器

    注意寄存器能够写的最大值 一个字节是255 -FF
    AX = 65535 = FFFFH

    练习
    mov ax,F4A3H AX = F4A3H
    mov ah,31H AX = 31A3H
    mov al,23H AX = 3123H
    add ax,ax AX = 6246H
    mov bx,826CH BX = 826CH
    mov cx,ax CX = 6246H
    mov ax,bx AX = 826CH
    add ax,bx AX = 04DBH (104DBH)
    mov al,bh AX = 0482H
    mov ah,bl AX = 6C82H
    add ah,ah AX = D882H
    add al,6H AX = D888H
    add al,al AX = D810H (D8110H)
    mov ax,cx AX = 6246H

    地址寄存器和地址的结合

    段地址:偏移地址
    ds si
    es di
    ss bp
    cs ip
    sp
    bx

    虚拟8086CPU 20根地址线 20bit 寄存器16bit

    物理地址 = 基础地址 + 偏移地址
    基础地址 = 段地址 * 16(10H)
    段地址 偏移地址
    1230H C8H = 1230H * 10H + C8H = 12300H+ C8H = 123C8H

    1.CPU存放段地址信息的寄存器? ds es ss cs
    2.CPU中存放偏移地址信息的寄存器? bp ip sp si di bx
    3.偏移地址能够表示的最大值是多少?FFFF

    练习

    1.给定段地址为0001H, 那么只通过偏移地址的变化来寻址,CPU的寻址范围是
    0001H * 10 H + (0000H~FFFFH)

    2.有一个数据存放在内存20000H单元中,现在给段地址a,如果只用偏移地址找到20000H,那么段地址a应该满足的条件是
    最小 ? 最大?

    A * 10H + (0000H ~FFFFH) = 20000H
    解出A即可

    CPU通过地址寄存器区分指令和数据

    开始 -> 运行 -> command -> debug -> r ->u

    指令
    a 回车
    mov ax, 4E20
    t 执行命令
    r 换行

    r ds回车0回车 修改寄存器里数据

    CPU将cs:ip所组合(指向)出来的地址里面的内容全部当做指令

    DS寄存器里的内容当做数据

    ip寄存器和指令的关系

    指令是有长度的,可以由多个字节组成
    指令执行的过程:
    1.CPU从cs:ip所组成的地址中读取指令,将这个指令存放到指令缓存器中
    2.IP = IP+所读指令的字节数
    3.执行指令缓存器中的内容,回到步骤1,重复这个过程

    转移指令

    jump

    • 8086提供了一个mov指令(传送指令),可以用来修改大部分寄存器的值,比如

      mov ax,10、mov bx,20、mov cx,30、mov dx,40

    • 但是,mov指令不能用于设置CS、IP的值,8086没有提供这样的功能

    • 8086提供了另外的指令来修改CS、IP的值,这些指令统称为转移指令,最简单的是jmp指令

    不允许 jump 33h
    可以这样 mov ax,33h
    jump ax 跳到ax

    1.假设cs = 2000, ip = 0000,

    jump第一个语法
    jump 段地址:ip地址
    jump 2000:3
    jump 的第二个语法
    jump ax ;意味着,将ax寄存器的值给了IP寄存器

    小结

    10进制 - > 2机制(机器部分) - >16进制 ->汇编指令 -> 内存 ->内存编号(内存地址)->地址(寻址能力)->数据线 ->控制线 ->寄存器 ->数据寄存器-> 地址寄存器 ->cs:ip ->指令如何执行

    机器指令
    CPU执行
    汇编指令 -> 编译器 -> 机器指令

    键盘
    鼠标
    显卡
    内存条
    麦克风
    网卡
    等等

    表示地址的电路
    地址线 0 或者1

    汇编程序员就是通过汇编指令 修改CPU的寄存器中的内容,从而达到控制整个计算机的目的
    mov ax,bx 移动指令
    add ax,ax
    sub ax,ax 运算指令
    jum xxxx:xxxx
    call xxxx 转移指令

    数据在哪里? 地址寄存器组合
    AX,BX,CX,DX 通用寄存器
    处理数据
    将结果存放起来 地址寄存器

    debug调试工具的指令

    r 打印所有的寄存器
    d 段地址:偏移地址 - 偏移地址 打印对应地址的内容
    u 将后续的字节翻译成汇编指令 查看汇编指令 段地址:偏移地址
    a 段地址:偏移地址
    e 段地址:偏移地址 修改内存里数据
    t 将。。。放到。。。

    内存中数据的长度

    :---------------------------------------------------------------------------------------------------------
    1.指令在哪里?
    2.数据在哪里?
    3.数据的长度
    4.对数据的处理
    5.数据存放在哪里
    :---------------------------------------------------------------------------------------------------------

    1.cs:ip指向的地址中的内容CPU当做是指令
    :---------------------------------------------------------------------------------------------------------
    Byte = 8bit (字节型数据) -》 一个内存地址就能保存一个字节
    Word = 2Byte = 16bit (字型数据) -》 一个字需要2个地址连续的内存单元来存储, 高位地址存放高位字节,低位地址存放低位字节

    mov ax,1122H
    AX = AH + AL AX 可以存放一个字型数据 = 可以存放2个字节型数据
    BX = BH + BL

    0 1 2 3 4 5 6

    数据的读取

    段地址:偏移地址信息
    ds ->段寄存器

    同样需要地址信息
    mov bx,2000H
    mov ds.bx
    mov al.ds:[0] -> 2000:0 ->al决定了只取一个字节

    Loop指令

    • loop指令和cx寄存器配合使用,用于循环操作类似高级语言的for,while
    • 使用格式
        mov cx,循环次数
    标号:循环代码
        loop 标号
    

    先执行标号前代码,再执行标号中代码,然后执行loop代码,进入标号处执行

    循环次数为cx的数据

    do-while

    相关文章

      网友评论

          本文标题:汇编语言学习笔记-仅供个人

          本文链接:https://www.haomeiwen.com/subject/lruphxtx.html