最近在学习王爽的汇编语言第四版,总结一下常用的汇编基础知识。(后续有待补充)
win7 32位虚拟机镜像百度网盘(也可以到MSDN下载)
链接:https://pan.baidu.com/s/1dAZimmjA_4jQYywMKcIyAw
提取码:lwle
Masm for Windows 集成实验环境
链接:https://pan.baidu.com/s/1ZaxH9GLsuHz2M_DpVi4GxA
提取码:1xaq
debug常用命令
-
R命令(查看、修改CPU中寄存器的值)
-r 查看寄存器的值
-r cs 修改cs寄存器的值 -
D命令(查看内存中的内容)
-d 段地址:偏移地址
-d 1000:01 查看内存100001处的内容
-d (查看默认cs:ip的内容)
-d 段地址:偏移地址 结尾偏移地址
-d 1000:0 9 查看10000-10009的内容 -
E命令(改写内存中的内容)
-e 1000:10 0 1 2 3 4 5 从1000:10开始向内存写入0 1 2 3 4 5
-e 1000:50 1 ‘a’ 2 ‘b’ 写入字符实际上是写入ASCII码
-e 1000:10 从1000:10开始写入 -
U命令(查看机器码对应的汇编指令)
-u 1000:0 查看1000:0处的机器码对应的汇编指令 -
T命令(执行当前指令。执行CS:IP指向的指令,并使CS:IP指向下一条指令)
-
A命令(以汇编指令的形式在内存中写入机器指令)
-a 1000:0 在1000:0处写汇编指令
1000:0000 mov ax,1
1000:0003 mov bx,2
1000:0006 add ax,bx -
Q命令(退出debug,返回到command中)
数据单位
1字节(byte) = 8位(bit)、ax=16位=2个字节
在16位的系统中(比如8086微机) 1字 (word)= 2字节(byte)= 16(bit)
在32位的系统中(比如win32) 1字(word)= 4字节(byte)=32(bit)
在64位的系统中(比如win64) 1字(word)= 8字节(byte)=64(bit)
寄存器
1.通用寄存器
一般通用寄存器都有AX、BX、CS、DX。通常用来存放一般性的数据。
2.段寄存器
8086CPU中有4个段寄存器:CS、DS、SS、ES
CS和IP:CS为代码段寄存器,IP为指令指针寄存器(个人理解 地址:偏移 CS用来存放指令的短地 址,IP存放指令的偏移地址)
段地址x16+偏移地址=物理地址
DS和[address]:通常用来存放要访问数据的段地址。
SS:SP:段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任何时刻,SS:SP指向栈顶元素。cpu从SS何SP中得到栈顶的地址。
CX寄存器:一般用于Loop指令(循环指令),CX中存放的是循环的次数
例:
mov cs,11
s: ax,ax (S=标号、所标识的地址)
loop s
执行顺序->先判断cx是否=0,如果不是cx-1,然后执行循环。
栈
最基本的是PUSH(入栈)和POP(出栈)
PUSH 寄存器:将一个寄存器中的数据入栈
POP 寄存器:出栈,用一个寄存器接收出栈的数据
注:入栈和出栈的操作都是以字为单位进行的。
push指令的执行步骤:①SP=SP-2;②向SS:SP指向的字单元中送入数据
pop指令的执行步骤:①从SS:SP指向的字单元中读取数据;②SP=SP+2
对于数据段,将他的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,cpu就将我们定义的数据段中的内容当做数据来访问;
对于代码段,将他的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的地址;
对于栈段,将他的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,比如执行push、pop指令时,就讲我们定义的栈段当做栈空间来用。