汇编语言Day07

admin 2025年7月3日13:03:24评论12 views字数 2413阅读8分2秒阅读模式
前言
Summer time

    开设一个日常学习以及笔记分享的篇章,这里主要分享一下,我自己学习的过程中,写的一些笔记。然后分享给大家,帮助大家学习。而这部分篇章的内容,不限于免杀、恶意开发、逆向等等内容。同时注意,请勿利用所学到的知识进行非法测试。如产生一切不良后果与文章作者无关。

PART.01

数据处理得两个基本问题

汇编语言Day07

计算机是进行数据处理、运算的机器,那么就有两个基本的问题:

  • 处理的数据在什么地方
  • 要处理的数据有多长

这两个问题必须在机器指令中明确或隐含的说明,我们定义的描述性符号: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
汇编语言Day07
汇编语言Day07
PART.02
BX SI DI BP
汇编语言Day07

前三个寄存器我们都使用过,总结一下:

  1. 在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]
  1.  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]
汇编语言Day07
汇编语言Day07
PART.03

 机器指令处理的数据在什么地方

汇编语言Day07

绝大部分机器指令都是进行数据处理的指令,大致分为三类:读取、写入、运算。机器指令只关心指令处理时数据所在的位置,可以在三个地方:CPU内部、内存、端口

机器码

汇编指令0

指令执行前数据的位置

8E1E0000

mov bx,[0]

内存,ds:0单元

89C3

mov bx,ax 

CPU内部,ax寄存器

BB0100

mov bx,1

CPU内部,指令缓冲器

汇编语言Day07
汇编语言Day07
PART.04
汇编语言种数据位置的表达
汇编语言Day07

立即数(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]
汇编语言Day07
汇编语言Day07
PART.05
寻址方式
汇编语言Day07
汇编语言Day07
汇编语言Day07
汇编语言Day07
PART.06
指令要处理的数据有多长
汇编语言Day07

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
汇编语言Day07
PART.07
往期笔记
汇编语言Day07

汇编语言Day06

汇编语言Day05

汇编语言Day04

汇编语言Day03

汇编语言Day02

汇编语言Day01

汇编语言基础知识

汇编语言Day07
汇编语言Day07
END
Summer time
汇编语言Day07
分享
汇编语言Day07
收藏
汇编语言Day07
在看
汇编语言Day07
点赞

汇编语言Day07

扫码关注我们
做一名优秀的网络保安

原文始发于微信公众号(伍六七安全):汇编语言Day07

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年7月3日13:03:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   汇编语言Day07https://cn-sec.com/archives/4219385.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息