• ASM第三章内存访问


    1.字在内存中存储时,要用两个地址连续的内存单元来存放。字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。

    2.[address]表示一个偏移地址为address的内存单元。
    用mov指令要存放内存单元时,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在ds寄存器中。
    同样的,在debug中使用d命令和e命令(处理内存数据),只需给出单元的偏移地址,段地址默认在ds寄存器中;使用a命令,u命令和t命令(处理指令),只需给出单元的偏移地址,段地址默认在cs寄存器中;

    3.摘抄一段:
    MOV指令是采用寻址方式最多的指令,用我们约定的符号可以表达如下:    
    MOV reg/mem,imm    ;立即数送寄存器或主存 
    MOV reg/mem/seg,reg  ;寄存器送寄存器(包括段寄存器)或主存 
    MOV reg/seg,mem    ;主存送寄存器(包括段寄存器) 
    MOV reg/mem,seg    ;段寄存器送主存或寄存器
    对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。
    (1)两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV  BL, AX等是不正确的; 
    (2)在内存和寄存器之间传送字类型数据时,高地址单元和高8位寄存器,低地址单元和低8位寄存器相对应;
    (3)两个操作数不能同时为段寄存器,如:MOV  ES, DS等;
    (4)两个操作数不能同时为存储单元,如:MOV  VARA, VARB等,其中VARA和VARB是同数据类型的内存变量;
    (5)代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV  CS, AX等不正确,但指令MOV  AX, CS等是正确的;
    (6)指令指针IP,不能作为MOV指令的操作数;
    (7)立即数不能直接传给段寄存器,如:MOV  DS, 100H等;
    (8)立即数不能作为目的操作数,如:MOV  100H, AX等; 
    (9)由于指定的寄存器有明确的字节或字类型,所以对应的立即数也必须分别是字节或字;但在涉及存储器单元时,指令中给出的立即数可以理解为字,也可以理解为字节,此时必须显式指明。为了区别是字节传送还是字传送,可用汇编操作符byte ptr(字节)和word ptr(字)指定;
    (10)对于不能直接传送的数据,如(2)(3)(6),可以使用通用寄存器作为中转站;不能用传送指令MOV修改寄存器CS和IP,可使用转移指令JMP设置它们的值。

    4.堆栈有两种基本操作,进栈指令PUSH和出栈指令POP。
    任意时刻,SS:SP指向栈顶元素。PUSH指令和POP指令执行时,CPU从SS和SP中得到栈顶的地址,然后POP是sp=sp+2,push是sp=sp-2.
    PUSH,POP实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与MOV指令不同的是,PUSH和POP指令访问的内存单元的地址不是在指令中给出的而是有SS:SP指出的。同时,PUSH 和POP指令还要改变SP中的内容。栈的操作都是以字为单位的。

      注: 1字(word)=2个字节(byte)=2*8位(bit)

    5.栈为空的情况下,sp是指向着栈底的下一个内存地址。

     解释:因为栈是以字为单位来操作的,设栈是16个字节,从1000h-100Fh结束,则100Eh是最靠近栈底的字的内容,pop后,sp=sp+2,帮SP指向的就是1010h这个地址。

    .栈顶超界的问题:
    当栈满的时候再使用PUSH指令入栈,或栈空的时候再使用POP指令出栈,都会发生栈顶超界的问题。
            8086CPU不保证我们对栈的操作不会超界。所以我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作时也要注意,以防止栈空的时候继续出栈而导致的超界。
            PUSH,POP等栈操作指令,修改的只是SP。因为逻辑段的最大容量为64KB,所以栈顶的变化范围最大为0-FFFFH。从栈空的时候SP=0,一直入栈,直到栈满使SP=0;如果再次入栈,栈顶将环绕,覆盖了原来栈中的内容。所以一个栈段的容量最大为64KB。

    段的综述:
            一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么都不是。关键在于CPU中寄存器的设置,即当CS:IP指向该处时,CPU将其视为代码;当SS;SP指向该处时,CPU将其视为栈;当DS指向该处时,CPU将其视为普通数据。
            Debug的T命令在执行修改段寄存器SS的指令时,下一条指令也紧接着被执行。

    作者:xiaoxia

    出处:http://cnblogs.com/xiaoxia

    本文遵从GNU 的自由文档许可证(Free Document License)的条款,欢迎转载、修改、散布。 

  • 相关阅读:
    [匈牙利算法] 洛谷 P1640 连续攻击
    [dfs] Jzoj P5916 flow
    [bfs] Jzoj P3522 迷宫花园
    [二分][状压dp] Jzoj P3521 道路覆盖
    [模拟] Jzoj P3520 原根
    [并查集] Jzoj P5914 盟主的忧虑
    [树上差分][子树求和][树形dp] Jzoj P5911 Travel
    [思维][暴力] Jzoj P5912 VanUSee
    [dfs][离散化] Jzoj P5910 DuLiu
    [cdq分治][树的重心] 洛谷 P3806 点分治1
  • 原文地址:https://www.cnblogs.com/xiaoxia/p/1637680.html
Copyright © 2020-2023  润新知