汇编学习第二课之 CS:IP,DS,SS:SP 寄存器

来源:互联网 发布:数据安全管理方法 编辑:程序博客网 时间:2024/05/22 14:04

日期:2016-05-03 星期二
汇编学习方法,先熟悉下基本的汇编指令,然后开始看滴水逆向视频教程,逆向下基本的语句,比如条件语句,循环语句,等等.一定要自己多动手实践,才能更好的理解其中的原理.知道基本的原理后,去踏踏实实的写c代码来反汇编.

1、DS寄存器(Data segment)
CPU根据DS寄存器和任意一个通用寄存器的值或其他数值组成的数据段物理地址

mov DS:[13ABH] ,1234H
将16进制常量1234H赋值给DS×16+偏移地址13ABH 的实际物理内存。
或 mov [13ABH] , 1234H
默认是将段寄存器DS的内容作为基地址

2、CS:IP 寄存器:
CPU通过CS:IP寄存器中的内容找到要执行的代码片段所在的实际物理内存地址

CS寄存器:保存CPU将要执行代码所在物理内存的基地址
IP寄存器:保存CPU将要执行代码所在物理内存的 偏移地址

CS:IP是搭配在一起使用的.

3、搭建汇编实验环境
环境:xp+cmd(debug)

cmd.exe debug模式下-r命令实现当前系统的寄存器的内容
-u cs:0100 #查看cs:0100 表示的内存中的内容,并且内容已经转为正常人看的懂的汇编指令了
-t:跟踪代码执行过程
实例:要求把ax、bx、cx的内容分别入栈,最后以相反顺序输出
before ax:1234H,bx:7ba1H,cx:2213H
after ax:2213H,bx:7ba1H,cx:1234H
-a (进入汇编编辑模式)
0B5D:0100 mov ax,1234
0B5D:0103 mov bx,7ba1
0B5D:0106 mov cx,2213
0B5D:0109 push ax
0B5D:010A push bx
0B5D:010B push cx
0B5D:010C pop ax
0B5D:010D pop bx
0B5D:010E pop cx
0B5D:010F

4.loop指令和bx指令
loop指令的格式是:loop标号,cpu执行loop指令的时候,要进行两步操作
1:(cx)=(cx)-1
2:判断cx中的值,不为零则转至标号处执行,如果为零,则向下执行

assume cs:codesg
codesg segment
start: mov ax,0#初始化ax和cx的值
mov cx,20
s: add ax,2
loop s

mov ax,4c00Hint 21H

codesg ends
end start

bx 和 loop指令
写汇编代码经常应用到[0]、[1]等标志,方括号中的数字表示某个偏移地址,该地址同段地址一起表示某个内存的位置。但是,masm等编译器实际上不支持[n]这样的写法,在代码中的[1]、[2]实际上会被处理成1、2等数字型常量,而不是我们希望的偏移 地址。

push ax
将ax的内容送入ss:sp指向的栈顶内存单元
sp = sp -2此时sp指向新的栈定单元
入栈数据从高字节向低字节排列,出栈相反.

pop ax
将SS:SP指向的栈顶内存单元内容送入ax寄存器
sp=sp+2,此时SS:SP指向新的栈顶单元
出栈数据从低字节向高字节排列

描述一个内存单元,需要两种信息:1.内存单元的地址 2.内存单元的长度
bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中

汇编是个很抽象的东西,学习起来不是很容易理解,所以一定要在平时多实践多练习才能更好的掌握它。

0 0