用dosbox写汇编分配内存为啥会重复向内存中写数据危险吗


(1)、汇编分配内存为啥会重复指令:机器码的助记符有对应的机器码。
(2)、伪指令:没有对应的机器码由编译器执行,计算机并不执行
(3)、其他符号:如+、—、*、/等,由编译器识别没有对应的机器码。
寄存器:8086CPU有14个寄存器没个寄存器有一个名称。这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW
段:在8086系统中段的最大值为64K。CPU可以用不同的段地址和便宜地址形成同一个物理地址8086CPU有4个段寄存器:CS、DS、SS、ES。
CS和IP是8086系统中最重要的兩个寄存器任意时刻,设CS中的内容为MIP中的内容为N,8086CPU将从内存M*16+N单元开始读取一条指令并执行。
“Jmp某一合法寄存器”指令的功能为:用寄存器的值修改为IP
用debug的R命令查看、改变CPU寄存器的内容;
用debug的D命令查看内存中的内容;
用debug的E命令改写内存中的内容;
用debug的U命令将内存中的机器指令翻译成汇编分配内存为啥会重复指令;
用debug的T命令执行一条机器指令;
用debug的A命令以汇编分配内存为啥会重复指令的格式在内存种写一條极其指令;
用debug的g命令,表示执行程序到当前的代码段;
用debug的P命令表示执行loop的循环直到(cx)=0为止。
使用“d 段地址:偏移地址”的格式debug將列出从指定内存单元开始的128个内存单元内容。
8086CPU不支持将数据直接送入段寄存器的操作ds是一个段寄存器,所以
moc  ds1000这条指令是非法的。那麼如果想要将1000H送入ds只好用一个寄存器来进行中转即先将1000H送入一个一般寄存器,如bx再将bx中的内容送入ds。
8086CPU中有两个寄存器,段寄存器SS和寄存器SP栈顶的段地址存放在SS中,偏移地址放在SP中任何时刻,SS:IP指向栈顶元素Push和pop指令执行时,CPU从SS和SP中得到栈顶的地址栈空时SP=0010H.
8086CPU不保证峩们队栈的操作不会超界。这也就是说8086CPU只知道栈顶在何处(由SS:SP指示),而不知道我们安排的空间有多大
动手开始写第一个汇编分配內存为啥会重复程序
Segment 和ends成对使用,定义一个段使用格式为:
End是汇编分配内存为啥会重复程序的结束标记,编译器在编译汇编分配内存为啥会重复程序的过程中如果碰到了伪指令end,就对源程序结束编译
这条伪指令的含义为“假设”。它假设某一段寄存器和程序中的某一個segment…ends定义的段相关联通过assume说明这种关联,在需要的情况下编译成西可以将段寄存器和某一个具体的段相联系。
(4)约定符号idata表示常量
功能:bx中存放的数据作为一个偏移地址EA段地址SA默认在ds中,将SA:EA的数据送入ax中即:(ax)=((ds)*16+(bx))。
Loop指令的格式为:loop标号CPU执行loop指令嘚时候,要进行两步操作1(cx)=(cx)-1;2判断cx中的值,不为零则转至标号处执行程序如果为零则向下执行。
汇编分配内存为啥会重复程序從写到执行的过程:
编程→*.asm→编译→*.obj→连接→*.exe→加载→内存中的程序→运行
关于注释:个人认为汇编分配内存为啥会重复中的注释是以“;”开头的
注意:看一下汇编分配内存为啥会重复中的一条指令  mov ax,0ffffh在汇编分配内存为啥会重复程序中,数据不能以字母开头所以要茬前面加0.
Debug 和masm的不同:(1)在汇编分配内存为啥会重复源程序中,如果用指令访问一个内存单元则在指令中必须用”[…]”来表示内存单元,如果在”[]”里用一个常量idata直接给出内存单元的偏移地址就要在”[]”的前面显示地给出段地址所在的段寄存器(2)如果在”[]”里用寄存器,比如bx间接给出内存单元的偏移地址,则段地址默认在ds中当然,也可以显示地给出选地址所在的段寄存器
段前缀:用来显示地内存单元的段地址的“ds:”“cs:”“ss:”“es:”,在汇编分配内存为啥会重复语言中称为段前缀
(1)我们需要直接向一段内存中写入内容;
(2)这段内存空间不应存放系统或其他程序的数据或代码,都则写入操作很坑内引发错误
(3)DOS方式下,一般情况0:200~0:2ff空间中没有系统或其他程序的数据或代码;
(4)以后,我们需要细节向一段内存中吸入内容时就是用0:200~0:2ff这段空间。
注:在王爽版的汇编分配内存为啥会重复語言中只讨论了内存分配的第一种方法:加载程序的时候为程序分配而执行过程中向系统申请的方法没有介绍。
汇编分配内存为啥会重複语言中“dw”的含义是定义字型数据
Si和di是8086CPU中的bx功能相近的寄存器,si和di不能够分成两个8为寄存器来使用
前三个寄存器已经用过,现来总結:
(3)         只要在[…]中使用寄存器bp而指令中没有显性地给出段地址,段地址就默认在ss中
汇编分配内存为啥会重复语言中数据位置的表达
指令要处理的数据有多长
有些指令默认了访问的是字单元还是字节段元,比如push [1000]就不用知名访问的是字单元还是字节单元,因为push指令只进荇字操作
Div是除法指令没使用div做除法的时候应注意以下问题:
(2)         被除数:默认放在AX或DX和AX中,如果除数为8位被除数为16位,默认在AX中存放;如果除数为16为被除数为32位,在DX和AX中存放DX存放高16位,AX存放低16位
(3)         结果:如果除数为8位,则AL存储除法操作的商AH存储除法操作的余數;如果除数为16位,则AX存储除法操作的商DX存储除法操作的余数。
Dup是一个操作符在汇编分配内存为啥会重复语言中同db、dw、dd等一样,也是甴编译器处理的符号它是和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复
定义了3个字节,他们值都是相当于 db 0,0,0.
定义了9个字節,他们是0、1、2、0、1、2、0、1、2相当于db 0,12,01,20,12,01,2.
可以修改IP或同时修改CS和IP的指令统称为转移指令。
实际上“jmp short 标号”的功能为:(IP)=(IP)+8位位移。
“jmp far ptr 标号”实现的是段间转移又称为远转移。
(CS) = 标号所在段的段地址;(IP)= 标号在段中的偏移地址
far ptr 指明了指囹用标号的段地址和偏移地址。
转移地址在寄存器中的jmp指令
转移地址在内存中的jmp指令
(2)          jmp dword ptr内存单元地址(短剑转移):从内存单元地址处開始存放着两个字搞地质处的字是转移的目的段地址,低地址处是转移的目的偏移地址
jcxz指令为有条件转移指令,所有的条件转移指令嘟是短转移在对应的机器码中柏寒转移的位移,问不是目的地址对IP的修改范围都是:-128~127
格式:jcxz标号(如果(cx)=0,转移到标号处执行)
操作:当(CX)=0时,(IP)=(IP)+8位位移;
8位位移=标号处的地址-jcxz指令后的第一个字节的地址;
8位位移的范围为-138~127用补码表示;
8位位移有编译程序茬编译时算出。
当(CX)≠0时什么也不做。
loop指令为循环指令所有的循环指令都是短转移,在对应的机器码中包含转移的位移而不是目嘚的地址。对IP的修改范围都为:-128~127
指令格式:loop 标号((CX)=(CX)-1如果(CX)≠0,转移到标号处执行)
8为位移=标号处的地址-loop指令后的第一个字節的地址;
8位位移的范围为-128~127,用补码表示;
8位位移由编程序在编译时算出
根据位移进行转移的意义
依据位移进行转移的call命令
call 标号(将当湔的IP压栈后,转到标号处执行指令)
CPU执行此种格式的call指令时进行如下操作:
CPU执行“call 标号”时,相当于进行:
转移的目的地址在指令中的call指令
转移地址在寄存器中的call指令
转移地址在内存中的vall指令
CPU执行“call word ptr 内存单元地址”时相当于进行:

}

  
//d盘下的文件是自行创建其中包含debug.exe僦可以了
    1. 安装完后打开其文件位置
    1. 在开头写入简单的配置文件

将源代码 生成最终 的 exe 文件 然后执行

  • 这一部分刚开始跟上做就好了不用了解清楚
//在创建txt文件把后缀改为asm


0 0 0 0 0.1.2.3就是他在数字中的位置

0

  1. 汇编分配内存为啥会重复指令是 机器指令的 注记符,同机器指令一一对应
  2. 每一种CPU都有自巳的汇编分配内存为啥会重复指令集

地址总线 决定 CPU 的 寻址能力


}

//d盘下的文件是自行创建其中包含debug.exe僦可以了
    1. 安装完后打开其文件位置
    1. 在开头写入简单的配置文件

将源代码 生成最终 的 exe 文件 然后执行

  • 这一部分刚开始跟上做就好了不用了解清楚
//在创建txt文件把后缀改为asm


0.1.2.3就是他在数字中的位置

  1. 汇编分配内存为啥会重复指令是 机器指令的 注记符,同机器指令一一对应
  2. 每一种CPU都有自巳的汇编分配内存为啥会重复指令集

地址总线 决定 CPU 的 寻址能力
数据总线 决定 CPU 的 一次传输数据量
控制总线 决定 CPU 的 对其他器件的控制能力


  1. 汇编汾配内存为啥会重复程序员 就是 通过 汇编分配内存为啥会重复语言 中的 汇编分配内存为啥会重复指令 去修改 寄存器的值 从而 控制 CPU 控制整个計算机

1 数据与寄存器之间 要 保持一致性8位寄存器给8位数据,16为寄存器给16位数据

(地址寄存器)指令寄存器 CS(段地址)和IP(偏移地址)

1.CPU从cs:ip 所指的内存单元中读取内容存取到 指令缓存器当中
2.然后IP跳转到下一个指令位置,并且在执行指令缓存器当中的指令

  1. CPU从cs:ip所指向的内存单元 讀取 指令 然后 存放到 指令缓存器当中
  2. IP = IP + 所读指令的长度从而指向下一条指令
  3. 执行指令缓存器的内容,回到步骤1

-r 查看和修改寄存器中的内容

-d 查看内存中的内容 段地址加偏移地址

-v 将机器指令翻译成汇编分配内存为啥会重复指令
-a 以汇编分配内存为啥会重复指令的格式 在内存中写入┅条汇编分配内存为啥会重复指令 每次debug都的写
-t 执行当前 cs:ip 所指的机器指令 代码段
-e 可以改写 内存中的内容(数据)



内存地址由 段地址偏移地址 构成
其中段地址默认保存在DS寄存器当中

4. -d 段地址:偏移地址

5. 在内存中存放自己定义的数据通过 ds和[] 来 让CPU访问数据

1. 段地址存放在cs寄存器中

2. 偏迻地址存放在ip寄存器当中

4. 修改cs:ip中的值就可使CPU执行代码

栈顶标记 在 数据(内存地址)的上面 的 内存地址
sp 偏移地址寄存器 ss 段地址寄存器

4. 处理数據时要 ,临时存放数据

5. 修改ss:sp中的值决定栈顶位置,CPU在执行的过程中把我们定义的栈段当作栈使用

6. 一段连续的内存地址

7. 栈的容量的最大极限

保存到栈中 为了让 ret 从栈中取回

8.每执行 一条 -t 指令 就会将寄存器的值保存到 栈中

  1. 内存分配的时间 1. 系统加载程序的时候 为程序分配的内存2. 程序执行过程中,向系统再去要内存空间

  • 我们可以把内存任意的划分为 栈数据,指令 他们可以是同一块内存,亦可以是不同的内存
  • ds:[] 所指姠的 内存 作为数据
  • cs:ip 所指向的 内存 作为指令

指令从哪里数据从哪来?临时性的数据存放到哪里


exe 文件 的描述信息中 保存的程序入口 地址
然後 系统 通过 描述文件 来设置 cs:ip 和 其它内存

asm 文件 – 汇编分配内存为啥会重复语言(1.汇编分配内存为啥会重复指令2.伪指令3.符号体系

  1. 汇编分配内存为啥会重复指令 由编译器 翻译成010101 的机器指令 最后由 CPU 执行
  2. 伪指令和符号体系 由编译器执行
    把系统加载程序的时候 给程序分配的内存 , 设置嘚寄存器 返还给系统因为 系统资源 是有限的
  • 字母型数字前面 必须加 0;
    1. 全为 1 才出 1 否则全部为 0
    2. 可用于 对 二进制位的数字 设 0
    1. 可用于对 二进制数芓设 1
  • like ‘………’ 其中单引号包含的 内容 编译器将把 其中的内容 转化为相应的 ASCII
  • 类似于BX 但是 不能 分成两个 8 为寄存器

sreg 段地址寄存器

在处理数据的時候要 告知 CPU 要处理的数据有多大可以通过一些方法来告知

  • 除数 有8位和16位 在一个reg或内存单元中
  • 被除数 默认 放在 ax(16位) 或者 dx(高16位) 和 ax(低16位)

伪指令 dd (占两个字)



  • 在编译是就已经处理好 要偏移的地址
  • 无论 本 命令在哪 只有 偏移地址




  • 只有在cx 为0 的情况下 才 执行 转移


通过栈中的数据来修妀 cs 和 ip 同时还会 修改栈顶标志

ret(用栈中的数据)


call(不能实现短转移)


  • call程序处理的数据一般要进行压栈

    • call下一条指令的IP压栈后,转到标号处

2.转移目的哋址在指令中


    • call下一条指令的CS:IP压栈后转到标号处

3.转移地址在寄存器中


    • call下一条指令的IP压栈后,转到reg

4. 转移地址在内存中



    • call下一条指令的IP压栈后转到内存单元地址

    • call下一条指令的CS:IP压栈后,转到标号处



  • 在子程序执行开头把所需要用到的寄存器压栈
  • 在子程序完成后,从栈中弹出各个寄存其的值


一个默认放在AL另一个放在内存字节单元或者8位reg

一个默认放在AX另一个放在内存字单元或者16位reg

结果 默认 高位在DX 低位在AX


}

我要回帖

更多关于 汇编分配内存为啥会重复 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信