Assembly language 检测点2.3
本帖最后由 狂潮丶 于 2013-10-30 21:16 编辑检测点2.3
下面的3条指令执行后,cpu几次修改IP?都是在什么时候?最后IP中的值是多少?
mov ax,bx
sub ax,ax
jmp ax
答:一共修改四次
第一次:读取mov ax,bx之后
第二次:读取sub ax,ax之后
第三次:读取jmp ax之后
第四次:执行jmp ax修改IP
最后IP的值为0000H,因为最后ax中的值为0000H,所以IP中的值也为0000H
实验一 查看CPU和内存,用机器指令和汇编指令编程
2实验任务
(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。
机器码 汇编指令 寄存器
b8 20 4e mov ax,4E20H ax=4E20H
05 16 14 add ax,1416H ax=6236H
bb 00 20 mov BX,2000H bx=2000H
01 d8 add ax,bx ax=8236H
89 c3 mov bx,ax bx=8236H
01 d8 add ax,bx ax=046CH
b8 1a 00 mov ax,001AH ax=001AH
bb 26 00 mov bx,0026H bx=0026H
00 d8 add al,bl ax=0040H
00 dc add ah,bl ax=2640H
00 c7 add bh,al bx=4026H
b4 00 mov ah,0 ax=0040H
00 d8 add al,bl ax=0066H
04 9c add al,9CH ax=0002H
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.
C:DOCUME~1ADMINI~1>debug
-a
0C1C:0100 mov ax,4e20
0C1C:0103 add ax,1416
0C1C:0106 mov bx,2000
0C1C:0109 add ax,bx
0C1C:010B mov bx,ax
0C1C:010D add ax,bx
0C1C:010F mov ax,001a
0C1C:0112 mov bx,0026
0C1C:0115 add al,bl
0C1C:0117 add ah,bl
0C1C:0119 add bh,al
0C1C:011B mov ah,0
0C1C:011D add al,bl
0C1C:011F add al,9c
0C1C:0121
-r
AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=0100 NV UP EI PL NZ NA PO NC
0C1C:0100 B8204E MOV AX,4E20
-t
AX=4E20BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=0103 NV UP EI PL NZ NA PO NC
0C1C:0103 051614 ADD AX,1416
-t
AX=6236BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=0106 NV UP EI PL NZ NA PE NC
0C1C:0106 BB0020 MOV BX,2000
-t
AX=6236BX=2000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=0109 NV UP EI PL NZ NA PE NC
0C1C:0109 01D8 ADD AX,BX
-t
AX=8236BX=2000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=010B OV UP EI NG NZ NA PE NC
0C1C:010B 89C3 MOV BX,AX
-t
AX=8236BX=8236CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=010D OV UP EI NG NZ NA PE NC
0C1C:010D 01D8 ADD AX,BX
-t
AX=046CBX=8236CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=010F OV UP EI PL NZ NA PE CY
0C1C:010F B81A00 MOV AX,001A
-t
AX=001ABX=8236CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=0112 OV UP EI PL NZ NA PE CY
0C1C:0112 BB2600 MOV BX,0026
-t
AX=001ABX=0026CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=0115 OV UP EI PL NZ NA PE CY
0C1C:0115 00D8 ADD AL,BL
-t
AX=0040BX=0026CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=0117 NV UP EI PL NZ AC PO NC
0C1C:0117 00DC ADD AH,BL
-t
AX=2640BX=0026CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=0119 NV UP EI PL NZ NA PO NC
0C1C:0119 00C7 ADD BH,AL
-t
AX=2640BX=4026CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=011B NV UP EI PL NZ NA PO NC
0C1C:011B B400 MOV AH,00
-t
AX=0040BX=4026CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=011D NV UP EI PL NZ NA PO NC
0C1C:011D 00D8 ADD AL,BL
-t
AX=0066BX=4026CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=011F NV UP EI PL NZ NA PE NC
0C1C:011F 049C ADD AL,9C
-t
AX=0002BX=4026CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=0C1CIP=0121 NV UP EI PL NZ AC PO CY
0C1C:0121 D3990075 RCR WORD PTR ,CL DS:B526=0000
-q
实验一 查看CPU和内存,用机器指令和汇编指令编程
(2)将下面的3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:0003
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.
C:DOCUME~1ADMINI~1>debug
-a 2000:0
2000:0000 mov ax,1
2000:0003 add ax,ax
2000:0005 jmp 2000:0003
2000:0007
-r cs
CS 0C1C
:2000
-r ip
IP 0100
:0000
-r
AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=2000IP=0000 NV UP EI PL NZ NA PO NC
2000:0000 B80100 MOV AX,0001
-t
AX=0001BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=2000IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-t
AX=0002BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=2000IP=0005 NV UP EI PL NZ NA PO NC
2000:0005 EBFC JMP 0003
-t
AX=0002BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=2000IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-t
AX=0004BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=2000IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-t
AX=0004BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=2000IP=0005 NV UP EI PL NZ NA PO NC
2000:0005 EBFC JMP 0003
-t
AX=0004BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=2000IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-t
AX=0008BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=2000IP=0005 NV UP EI PL NZ NA PO NC
2000:0005 EBFC JMP 0003
-t
AX=0008BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1CES=0C1CSS=0C1CCS=2000IP=0003 NV UP EI PL NZ NA PO NC
2000:0003 01C0 ADD AX,AX
-q
实验一 查看CPU和内存,用机器指令和汇编指令编程
(3) 查看内存中的内容
PC主板上的ROM中有个一出产日期,在内存FFF00H-FFFFFH的某几个单元中,请找到这个出产日期并试图改变它。
Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.
C:DOCUME~1ADMINI~1>debug
-d ffff:0 f
FFFF:0000EA 5B E0 00 F0 31 32 2F-32 35 2F 30 37 00 FC 59 .[...12/25/07..Y
-q
地址C0000~FFFFF的内存单元为只读存储器,写入数据操作是无效的。
因此出产日期无法改变。
下面内容摘自于网上
还有另一种情况,如果你发现你能修改ROM中的生产日期,那么原因如下:
每个计算机的结构都不一样,教材考虑的是普通8086PC机上的效果,个别计算机的效果可能不同。
也就是说 在你的计算机中 这个内存是可修改的
所以,认为所有的计算机某些地址的内存不能修改是片面的。
书上说rom是只读的你就不去验证了吗?如何验证呢?
我觉得这个实验最大的好处不是让我们验证了这个知识点,而是提醒我们要有怀疑的精神,怀疑之后再去验证才能跟深刻的理解知识,提升自己的能力,甚至还会发现有些书上描述的不准确甚至错误的地方。
--引用这几本书综合研究的三个问题:
都再用,我们就非得用吗?
规定了,我们就只知道遵守吗?
司空见惯,我们就不怀疑了吗?
尽信书不如无书大概也有这个道理吧^_^
谢谢楼主,有那东西练手的,谢谢分享, 咱不管是不是教材上的东西。
拿 出来就是好东西…… …… 楼主是个好人 好人一生平安 LZ,请教:是不是只要CS:IP指向内存进行读取指令,指令进入指令缓冲器,接着IP都会加指令长度再赋值IP啊?(不管add或者sub等任何指令){:1_1:} 下面这个实验中:
(2)将下面的3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:0003
在输入第四个t命令时ax寄存器中的值不是就应该变为0004了么,为什么还是0002,我用dosbox做出来的结果是0004,求解释 本帖最后由 小楼,一夜风雨 于 2013-10-27 14:14 编辑
下面这个实验中:
(2)将下面的3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:0003
在输入第四个t命令时ax寄存器中的值不是就应该变为0004了么,为什么还是0002,我用dosbox做出来的结果是0004,求解释@小甲鱼 本帖最后由 狂潮丶 于 2013-10-27 23:06 编辑
小楼,一夜风雨 发表于 2013-10-27 14:03 static/image/common/back.gif
下面这个实验中:
(2)将下面的3条指令写入从2000:0开始的内存单元中,利用这3条指令计算2的8次方。
...
鱼油,你好:
第四个t执行的时候,ax里面的内容是等于4。
mov ax,2
add ax,ax
add ax,ax
你的代码有问题。
狂潮丶 发表于 2013-10-27 23:03 static/image/common/back.gif
鱼油,你好:
对啊,我的也是4,只是楼主的为2,我怀疑楼主写错了所以问问。 本帖最后由 小楼,一夜风雨 于 2013-10-30 21:45 编辑
。。。。。。根据你付的答案。。。。。。。。 根据你附的答案,第四次执行t命令后ax显示结果是0002h
收藏每一次的监测点答案 bigshan 发表于 2013-11-13 12:25 static/image/common/back.gif
收藏每一次的监测点答案
加油。 共同学习一下!! 2的8次方等于256, ax = 0004H 计算结果不对的?怎么看结果啊? 瞬间秒懂,原来还没循环第8次 t.ax= 0100H 转换成十进制 256
页:
[1]