开设一个日常学习以及笔记分享的篇章,这里主要分享一下,我自己学习的过程中,写的一些笔记。然后分享给大家,帮助大家学习。而这部分篇章的内容,不限于免杀、恶意开发、逆向等等内容。同时注意,请勿利用所学到的知识进行非法测试。如产生一切不良后果与文章作者无关。
数据处理得两个基本问题
计算机是进行数据处理、运算的机器,那么就有两个基本的问题:
-
处理的数据在什么地方 -
要处理的数据有多长
这两个问题必须在机器指令中明确或隐含的说明,我们定义的描述性符号:reg和sreg为了描述上的简洁,我们使用两个描述性的符号reg来表示一个寄存器,用sreg表示一个段寄存器。
两个符号的集合:
-
reg: ax bx cx dx ah al bh bl ch cl dh dl sp bp si di -
sreg: ds ss cs es
前三个寄存器我们都使用过,总结一下:
-
在8086中,只有这四个寄存器可以在[....]中进行内存单元的寻址
正确的:mov ax,[bx]mov ax,[bx+si]mov ax,[bx+di]mov ax,[bp]mov ax,[bp+si]mov ax,[bp+di]错误的:mov ax,[cx]mov ax,[ax]mov ax,[dx]mov ax,[ds]
-
4个寄存器可以单个出席那,也可以以4种组合出现: bx和si、bx和di、bp和si、bp和di
正确的:mov ax,[bx]mov ax,[si]mov ax,[di]mov ax,[bp]mov ax,[bx+si]mov ax,[bx+di]mov ax,[bp+di]mov ax,[bx+si+idata]mov ax,[bx+di+idata]mov ax,[bp+si+idata]mov ax,[bp+di+idata]错误的:mov ax,[bp]mov ax,[bp+idata]mov ax,[bp+si]mov ax,[bp+si+idata]
机器指令处理的数据在什么地方
绝大部分机器指令都是进行数据处理的指令,大致分为三类:读取、写入、运算。机器指令只关心指令处理时数据所在的位置,可以在三个地方:CPU内部、内存、端口
机器码 |
汇编指令0 |
指令执行前数据的位置 |
8E1E0000 |
mov bx,[0] |
内存,ds:0单元 |
89C3 |
mov bx,ax |
CPU内部,ax寄存器 |
BB0100 |
mov bx,1 |
CPU内部,指令缓冲器 |
立即数(idata)
对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编中称为立即数idata,在汇编中直接给出
mov ax,1add bx,2000hor bx,0000000bmov al,'a'
寄存器
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名
mov ax,bxmov ds,axpush bxmov ds:[0],bxpush dsmov ss,axmov sp,ax
段地址(SA)和偏移地址(EA)
指令要处理的数据在内存中,在汇编指令中可用[x]的格式给出EA、SA在某个段寄存器中,存放段地址的寄存器可以是默认的,比如
以下指令段地址的寄存器是ds
mov ax,[0]mov ax,[di]mov ax,[bx+8]mov ax,[bx+si]mov ax,[bx+si+8]
以下指令段地址的寄存器是ss
mov ax,[bp]mov ax,[bp+8]mov ax,[bp+si]mov ax,[bp+si+8]
存放段地址的寄存器也可以显性的给出
mov ax,ds:[bp]mov ax,es:[bx]
8086可以处理两种尺寸的数据,byte和word,用哪种尺寸,汇编中用以下方法处理
通过寄存器名指定要处理的数据的尺寸
例如下面指令中,寄存器指明了指令进行的是子操作
mov ax,1mov bx,ds:[0]mov ds,axmov ds:[0],axinc axadd ax,1000
下面是字节操作
mov al,1mov al,blmov al,ds:[0]mov ds:[0],alinc aladd al,100
在没有寄存器名时,用操作符 X ptr 指明内存单元长度、X在汇编指令中可以为byte或word
例如下面的指令中,用word ptr 指明访问的内存单元时一个字单元
mov word ptr ds:[0],1inc word ptr [bx]inc word ptr ds:[0]add word ptr [bx],2
下面的指令中,用byte ptr 指明了指令访问的内存单元你是一个字节单元
mov byte ptr ds:[0],1inc byte ptr [bx]inc byte ptr ds:[0]add bytee ptr [bx],2
在没有寄存器参与的内存单元访问指令中,用word ptr或byte otr显性的指明所要访问的内存单元的长度非常又必要,否则CPU不知道访问的时字单元还是字节单元,假设我么能用debug查看内存的情况如下: 2000:1000 FF FF FF FF FF FF...
那么下面指令将使内存中内容变为 2000:1000 01 FF FF FF FF FF ...
mov ax,2000Hmov ds,axmov byte ptr [1000H],1
而下面指令使内容变为 2000:1000 01 00 FF FF FF FF ...
mov ax,2000hmov ds,axmov word ptr [1000H],1
其他方法
有些指令默认了访问的使字单元还是字节单元,比如 push [1000H] 就不用指令访问的类型,因为push 指令只进行字操作
原文始发于微信公众号(伍六七安全):汇编语言Day07
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论