九章:转移指令的原理
可以修改IP,或同时修改CS和IP的指令统称为转移指令,转移指令就是可以控制CPU执行内存中某处代码的指令。
8086CPU的转移行为有以下几类:
.只修改IP时,称为段内转移,比如:jmp ax.
.同时修改CS和IP时,称为段间转移,比如:jmp 1000:0
根据对IP修改风范围不同,段内转移又分为:短转移和近转移。
.短转移IP的修改范围为-128~127
.近转移IP的修改范围为-32768~32767
8086CPU的转移指令分为以下几类。
.无条件的转移指令(如:jmp)
.条件转移指令
.循环指令(如:loop)...
[2013-12-08 21:16] 第九章 (答案属于个人解答,如有问题请留言指教交流,谢谢!O(∩_∩)O~)
阅读全文 |
评论次数(0) |
浏览次数(495) |
所属类型(总结)
[2013-12-08 21:14] 第八章 (答案属于个人解答,如有问题请留言指教交流,谢谢!O(∩_∩)O~)
八章:数据处理的两个基本问题
(1)处理的数据在什么地方?
(2)要处理的数据有多长?
寄存器:(register)
段寄存器:segment register
reg集合:ax bx cx dx ah al bh bl ch cl dh dl sp bp si di;
sreg集合:ds ss cs es
8.1 bx、si、di 和bp
1、在8086cpu中,只有这4个寄存器可以用在"[...]"中来进行内存单元的寻址。
2、在[...]中,这4个寄存器可以单个出现,或只能以4中组合出现:bx和si、bx和di、bp和si、bp和di。
3、只要在[.....
(1)处理的数据在什么地方?
(2)要处理的数据有多长?
寄存器:(register)
段寄存器:segment register
reg集合:ax bx cx dx ah al bh bl ch cl dh dl sp bp si di;
sreg集合:ds ss cs es
8.1 bx、si、di 和bp
1、在8086cpu中,只有这4个寄存器可以用在"[...]"中来进行内存单元的寻址。
2、在[...]中,这4个寄存器可以单个出现,或只能以4中组合出现:bx和si、bx和di、bp和si、bp和di。
3、只要在[.....
阅读全文 |
评论次数(0) |
浏览次数(423) |
所属类型(总结)
[2013-12-08 21:12] 第七章 (答案属于个人解答,如有问题请留言指教交流,谢谢!O(∩_∩)O~)
更灵活的定位内存地址的方法
之前:[idata]、[bx]
7.1 and 和 or 指令。
(1)and 指令:逻辑与指令,按位进行 与 运算。
通过该指令可将操作对象的相应位设为0,其他位不变。(异位为0)
将al的第6位设为0的指令是:and al,10111111B
将al的第7位设为0的指令是:and al,01111111B
(2) or 指令 :逻辑或指令,按位进行 或 运算。
通过该指令可将操作对象的相应位设为1,其他位不变。(异位为1)
将al的第6位设为0的指令是:and al,01000000B
将al的第7位设为0的...
之前:[idata]、[bx]
7.1 and 和 or 指令。
(1)and 指令:逻辑与指令,按位进行 与 运算。
通过该指令可将操作对象的相应位设为0,其他位不变。(异位为0)
将al的第6位设为0的指令是:and al,10111111B
将al的第7位设为0的指令是:and al,01111111B
(2) or 指令 :逻辑或指令,按位进行 或 运算。
通过该指令可将操作对象的相应位设为1,其他位不变。(异位为1)
将al的第6位设为0的指令是:and al,01000000B
将al的第7位设为0的...
阅读全文 |
评论次数(0) |
浏览次数(471) |
所属类型(反思)
[2013-12-08 21:10] 第六章 (答案属于个人解答,如有问题请留言指教交流,谢谢!O(∩_∩)O~)
包含多个段的程序:
如果我们需要的空间超过256个字节该怎么办?
程序取得空间的方法有2种:一是在加载程序的时候为程序分配,再就是程序在执行的过程中向系统申请。本书不讨论第二种方法。
1、在代码段中使用数据
例:累加 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
源程序:
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
mov bx,0
mov ax,0
mov cx,8
s:add...
如果我们需要的空间超过256个字节该怎么办?
程序取得空间的方法有2种:一是在加载程序的时候为程序分配,再就是程序在执行的过程中向系统申请。本书不讨论第二种方法。
1、在代码段中使用数据
例:累加 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
源程序:
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
mov bx,0
mov ax,0
mov cx,8
s:add...
阅读全文 |
评论次数(0) |
浏览次数(455) |
所属类型(总结)
[2013-11-07 20:33] 第5章总结、笔记
1、[bx]和内存单元的描述
[bx]表示一个内存单元,它的偏移地址在bx 中,,比如 mov al,[bx];
loop 指令:代表循环。
2、描述性符号:“()”
(ax)表示ax当中的内容,(al)表示al当中的内容。(ds)表示ds当中的内容,(20000H)表示内存20000H单元的内容。
“()”当中的元素可以有3中类型:a、寄存器名。b、段寄存器。c、内存单元的物理地址(一个20位数据)。
“(X)”表示的数据有两种类型:a、字节。b、字。是哪种类型由寄存器名和运算决定。
(al)为字节型,(ax)为字型。al=(20000H)为字节型,,a...
[bx]表示一个内存单元,它的偏移地址在bx 中,,比如 mov al,[bx];
loop 指令:代表循环。
2、描述性符号:“()”
(ax)表示ax当中的内容,(al)表示al当中的内容。(ds)表示ds当中的内容,(20000H)表示内存20000H单元的内容。
“()”当中的元素可以有3中类型:a、寄存器名。b、段寄存器。c、内存单元的物理地址(一个20位数据)。
“(X)”表示的数据有两种类型:a、字节。b、字。是哪种类型由寄存器名和运算决定。
(al)为字节型,(ax)为字型。al=(20000H)为字节型,,a...
阅读全文 |
评论次数(0) |
浏览次数(626) |
所属类型(总结)
[2013-09-09 15:28] 第四章总结:
源程序:segment 和 ends :是一成对的伪指令,写程序时必须用到。
功能:定义一个数据段,segment 说明段的开始 ends 说明段的结束。
格式:
段名 segment
:
:
段名 ends
程序:[段1][段2]...[段n]
[段*]:[代码][数据][栈空间]。
end:一个汇编程序的结束标记。
assume:【假设】它假设某一段寄存器和程序中的某一个用segment...ends 定义的段相关联起来。
如:assume cs:codesg
codesg segment
...
功能:定义一个数据段,segment 说明段的开始 ends 说明段的结束。
格式:
段名 segment
:
:
段名 ends
程序:[段1][段2]...[段n]
[段*]:[代码][数据][栈空间]。
end:一个汇编程序的结束标记。
assume:【假设】它假设某一段寄存器和程序中的某一个用segment...ends 定义的段相关联起来。
如:assume cs:codesg
codesg segment
...
阅读全文 |
评论次数(0) |
浏览次数(517) |
所属类型(总结)
[2013-07-26 11:13] 第三章监测点3.1
监测点3.1:
(1)在debug中,用“d 0:0 1f”查看内粗你,结果如下。
0000:0000 70 80 F0 30 EF 60 30-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完成后相关寄存器中的值。
mov ax,1
mov ds,ax
mov ax,[0000] ax=2662H; ds:0000= 0001:0000=00010;
mov bx,[0001] bx=E626H; ...
(1)在debug中,用“d 0:0 1f”查看内粗你,结果如下。
0000:0000 70 80 F0 30 EF 60 30-00 80 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行完成后相关寄存器中的值。
mov ax,1
mov ds,ax
mov ax,[0000] ax=2662H; ds:0000= 0001:0000=00010;
mov bx,[0001] bx=E626H; ...
阅读全文 |
评论次数(0) |
浏览次数(526) |
所属类型(汇编作业)
[2013-07-22 22:25] 实验1查看CPU和内存,用机器指令和汇编指令编程
1.使用debug将上面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的变化。
2.利用下面3条指令计算2的次方。
mov ax,1
add ax,ax
jmp 2000:0003
解:
-a 2000:0
mov ax,2
add ax,ax
jmp 2000:0003
用t命令执行8次即可。
3.查看内存中的内容:
pc机主板的 ROm中FFF00~FFFFF中存在此主板的生产日期;
可是无法修改。我的为:02/14/11;因为是ROM中,所以无法修改。
4.向内存B810出写入数据:
如:-e B810:0 11 11 22 22...
2.利用下面3条指令计算2的次方。
mov ax,1
add ax,ax
jmp 2000:0003
解:
-a 2000:0
mov ax,2
add ax,ax
jmp 2000:0003
用t命令执行8次即可。
3.查看内存中的内容:
pc机主板的 ROm中FFF00~FFFFF中存在此主板的生产日期;
可是无法修改。我的为:02/14/11;因为是ROM中,所以无法修改。
4.向内存B810出写入数据:
如:-e B810:0 11 11 22 22...
阅读全文 |
评论次数(0) |
浏览次数(475) |
所属类型(汇编作业)
[2013-07-22 21:55] 最近几天的笔记总结:
8086CPU是16位结构的CPU
结构特性:
a 运算一次最多可以处理16位的数据,也就是2个字节,2Byte。
b 寄存器的最大宽度为16位,也就是2个字节,2Byte,一个字word。
c 寄存器和运算器之间的通路为16位。应该是允许通过的字节是2个字节,2Byte。
8086CPU给出物理地址的方法:
8086CPU的地址总线为20位,也就有1MB的寻址能力。但因为内部是16位结构。所以在8086CPU内部采用将 两个16位地址合成 一个20位的物理地址的方法。
规律:
(1)一个数据的二进制形式左移1位,相当于该数据乘以2;
...
结构特性:
a 运算一次最多可以处理16位的数据,也就是2个字节,2Byte。
b 寄存器的最大宽度为16位,也就是2个字节,2Byte,一个字word。
c 寄存器和运算器之间的通路为16位。应该是允许通过的字节是2个字节,2Byte。
8086CPU给出物理地址的方法:
8086CPU的地址总线为20位,也就有1MB的寻址能力。但因为内部是16位结构。所以在8086CPU内部采用将 两个16位地址合成 一个20位的物理地址的方法。
规律:
(1)一个数据的二进制形式左移1位,相当于该数据乘以2;
...
阅读全文 |
评论次数(0) |
浏览次数(465) |
所属类型(总结)
[2013-07-22 10:26] 监测点 2.3
执行完下面3条指令,程序修改了几次IP,分别是在什么时候,最后IP的值为多少?
mov ax,bx
sub ax,ax
jmp ax
一共修改了4次IP:
读取mov ax,bx后 IP的值改变,执行mov ax,bx
读取sub ax,ax后 IP的值改变,执行sub ax,ax
读取jmp ax后 IP的值改变,执行jmp ax
因为 执行的是jmp ax 所以IP再次被改变,最后IP=ax=0,一共4次改变。...
mov ax,bx
sub ax,ax
jmp ax
一共修改了4次IP:
读取mov ax,bx后 IP的值改变,执行mov ax,bx
读取sub ax,ax后 IP的值改变,执行sub ax,ax
读取jmp ax后 IP的值改变,执行jmp ax
因为 执行的是jmp ax 所以IP再次被改变,最后IP=ax=0,一共4次改变。...
阅读全文 |
评论次数(0) |
浏览次数(479) |
所属类型(汇编作业)
『 查看更多文章 』