(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 内存单元地址”时相当于进行: