汇编学习笔记 第三章

来源:互联网 发布:全球生产网络弊端 编辑:程序博客网 时间:2024/06/06 00:52
 1.使用R命令查看、改变CPU寄存器的内容
    r ax
    ax 0000
    :1111
    2. 用D命令查看内存中的内容
    d 段地址:偏移地址
    列出从指定内存单元开始的128个内存单元的内容。
   d 1000:0 列出从1000:0~1000:7F
指定D命令查看范围 d 段地址:起始偏移地址 结尾偏移地址
    要查看 1000:0~1000:9的内容,用d 1000:0 9
    3.用E命令改写内存中的内容
    e 起始地址 数据 数据
    e 1000:0 b8 01 00 b9 02 00 01 c8
    4.用A命令以汇编指令的形式在内存中写入机器指令
    
3.1内存中字的存储
任何两个地址连续的内存单元,N号单元和N+1号单元,可以将他们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。

CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。0是低字节,1是高字节。4E20H在内存中存放如下。4E是高8位,存放在高位字节即内存地址为1处。

3.2 DS和【address】
mov指令的传送功能:
  • 将数据直接送入寄存器;mov ax,2
  • 将一个寄存器中的内容送入另一个寄存器中;mov bx,ax
  • 将一个内存单元中的内容送入一个寄存器;mov al,[0]
8086CPU 不支持将数据直接送入段寄存器(硬件设计的问题)
mov ds,10000H;是非法的
数据->通用寄存器->段寄存器
从内存单元中读取数据到寄存器
  • mov bx,1000H
  • mov ds,bx
  • mov al,[0];[0]中的0代表内存单元的偏移地址,指令执行时自动取ds中的数据为内存单元的段地址
将数据从寄存器送入内存单元
  • mov bx,1000H
  • mov ds,bx
  • mov [0],al
寄存器CS和IP中存放当前指令的段地址和偏移地址。
3.4 mov,add,sub指令
add ds,ax
sub ds,ax
以上两个语句都是错误的,段寄存器是不可以用在算术运算指令中的。

在win7上模拟debug的步骤。

数据和程序在计算机中都是以二进制形式存放的,区别数据和程序,关键是看段地址,如果段地址是ds段,说明该内存中存放的是数据,如果段地址是cs段,说明内存中存放的是程序指令。
3.6 栈
8086CPU的入栈和出栈操作都是以字为单位进行的。
pop ax;把栈顶元素弹出并存入ax中

段寄存器SS :存放栈顶的段地址
寄存器SP    :存放栈顶的偏移地址
SS:SP 指向栈顶元素
push指令的执行过程
push ax
  • SP=SP-2
  • 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
栈空,SS:SP指向占空间最高地址单元的下一个单元。

任意时刻,SS:SP 指向栈顶元素,当栈为空时,栈中没有元素,也就不存在栈顶元素。所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2。栈最底部字单元地址为1000:000E,所以栈空时SP=0010H

区别程序和数据时,关键看段地址,若段地址是ds段,说明内存中存放的是数据。若段地址是cs段,则内存中存放的是程序指令。

当栈满的时候再使用push入栈,或栈空的时候再使用pop指令出栈,都将发生栈超界问题。

DebugT命令修改SS寄存器时,下一条指令也紧接着执行。


























原创粉丝点击