美文网首页
汇编学习笔记(二)

汇编学习笔记(二)

作者: Jesse_996 | 来源:发表于2019-12-24 17:12 被阅读0次

    debug 用法

    1.查看、修改 cpu 中寄存器的内容:R
    2.查看内存中的内容:D
    3.修改内存中的内容:E(可以写入数据、命令,无区别)
    4.将内存中的内容解释为机器指令和对应的汇编指令:U
    5.执行 CS:IP 指向的内存单元的指令:T
    6.以汇编指令的形式向内存中写入命令:A
    7.G命令可以直接让IP跳到指定位置,如g 0012,会使IP跳到0012的位置。
    8.用p命令可以从循环中一次循环完。也可以用g命令,直接跳到指定位置。

    (T命令在执行修改寄存器SS的指令时,下一条指令也紧接着执行)

    寄存器(内存访问)

    字单元:存放一个字型数据(16 位)的内存单元,由两个地址连续的内存单元组成。高地址存高位字节,低地址存地位字节。

    DS 和[address]

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

    将 10000H 中的数据读到 al 中 :

    mov bx,1000H
    mov ds,bx
    mov al,[0]
    

    mov 指令中的[]说明操作对象是一个内存单元,[]中的 0 说明偏移地址是 0,段地址默认是 ds。8086cpu 不支持将数据直接送入段寄存器,而是要用一个寄存器中转,即mov ds,1000H是非法的。

    addsub对段寄存器都是非法的,即add ds,ax,add ds,1,add, ds,[1]都是非法的。

    综上,段寄存器的相关操作有:

    mov 段寄存器,寄存器
    mov 寄存器,段寄存器
    mov 段寄存器,内存单元
    mov 内存单元,段寄存器

    即段寄存器可以用 mov 与寄存器和内存单元进行操作(不能与数据),不能用addsub

    push入栈,pop 出栈,如push ax,pop ax
    SS:SP用来指向栈顶元素。

    入栈过程
    如图,8086入栈时,栈顶从高地址向低地址方向增长。因为任意时刻SS:SP指向栈顶,所以当栈为空时,SS:SP指向栈的最底部单元下面的单元。

    pop与push相反


    出栈过程

    8086不保证我们对栈的操作不会过界,我们只能自己注意。
    push和pop操作形式有如下几种:

    push 寄存器/段寄存器/内存单元
    pop 寄存器/段寄存器/内存单元

    段是我们人为规定的。

    • 数据段:段地址放在DS中,用mov、add、sub等访问内存单元的指令时,cpu就将我们单一的数据段中的内容当成数据来看。
    • 代码段:段地址放在CS中,段中第一条指令的偏移地址放在IP中,cpu将执行指令。
    • 栈段:段地址放在SS中,栈顶元素的偏移地址放在SP中,cpu进行站操作如push、pop时将栈段当做栈空间操作。

    一段内存可以既是代码段又是数据段,又是栈段,也可以都不是。这取决于CS、IP、SS、SP、DS的指向。

    第一个程序

    汇编语言源程序包含两种指令:
    1.汇编指令:有对应机器码,可以被编译为机器指令,最终被cpu执行。
    2.伪指令:没有对应机器码,不被cpu执行,由编译器来执行。

    assume cs:abc
    abc segment
        mov ax,2
        add ax,ax
        add ax,ax
        mov ax,4c00H
        int 21H
    abc ends
    end
    

    segment

    segmentends是一对成对使用的伪指令,是必须要用到的一对伪指令,用来定义一个段,使用格式为:

    段名 segment
    ..
    段名 ends
    

    一个汇编程序由多个段组成,这些段用来存放代码、数据或当做栈空间。一个有意义的汇编程序必须要有一个代码段。

    end

    end是会变程序结束的标记,不要搞混endendsends是和segment成对使用的。

    assume

    这条伪指令含义是“假设”,它假设某一段寄存器和程序的某一个用segment...ends定义的段相关联。只要记住assume是将有特定用途的段和相关联的段寄存器关联起来即可。
    比如,用cname segment... cname ends定义了一个名为cname的段,在程序开头,用assume cs:cnamecname段和cs联系起来。

    程序返回需要使用以下2条语句:

    mov ax,4c00H
    int 21H
    

    loop

    作用是循环,cpu执行loop的时候,进行2部操作:
    1.(cx)=(cx)-1
    2.判断cx中的值,不为0则转到标号处执行,否则向下执行

    相关文章

      网友评论

          本文标题:汇编学习笔记(二)

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