狂潮丶 发表于 2013-7-29 15:24:16

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是只读的你就不去验证了吗?如何验证呢?
我觉得这个实验最大的好处不是让我们验证了这个知识点,而是提醒我们要有怀疑的精神,怀疑之后再去验证才能跟深刻的理解知识,提升自己的能力,甚至还会发现有些书上描述的不准确甚至错误的地方。

--引用这几本书综合研究的三个问题:
都再用,我们就非得用吗?
规定了,我们就只知道遵守吗?
司空见惯,我们就不怀疑了吗?

尽信书不如无书大概也有这个道理吧^_^

欠你的幸福 发表于 2013-8-20 22:14:53

谢谢楼主,有那东西练手的,谢谢分享, 咱不管是不是教材上的东西。
   拿 出来就是好东西…… ……

于鱼鱼鱼鱼 发表于 2013-9-8 14:46:54

楼主是个好人 好人一生平安

Ivan_t 发表于 2013-9-19 01:03:01

LZ,请教:是不是只要CS:IP指向内存进行读取指令,指令进入指令缓冲器,接着IP都会加指令长度再赋值IP啊?(不管add或者sub等任何指令){:1_1:}

小楼,一夜风雨 发表于 2013-10-27 14:03:02

下面这个实验中:
(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:03:33

本帖最后由 小楼,一夜风雨 于 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:03:09

本帖最后由 狂潮丶 于 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-30 12:20:28

狂潮丶 发表于 2013-10-27 23:03 static/image/common/back.gif
鱼油,你好:




对啊,我的也是4,只是楼主的为2,我怀疑楼主写错了所以问问。

小楼,一夜风雨 发表于 2013-10-30 12:25:49

本帖最后由 小楼,一夜风雨 于 2013-10-30 21:45 编辑

。。。。。。根据你付的答案。。。。。。。。                                                             根据你附的答案,第四次执行t命令后ax显示结果是0002h

bigshan 发表于 2013-11-13 12:25:34

收藏每一次的监测点答案

狂潮丶 发表于 2013-11-13 12:26:19

bigshan 发表于 2013-11-13 12:25 static/image/common/back.gif
收藏每一次的监测点答案

加油。

oggplay 发表于 2014-2-2 00:44:29

共同学习一下!!

whyinfi 发表于 2015-9-28 05:53:40

2的8次方等于256,   ax = 0004H 计算结果不对的?怎么看结果啊?

whyinfi 发表于 2015-9-28 05:59:23

瞬间秒懂,原来还没循环第8次 t.ax= 0100H 转换成十进制 256
页: [1]
查看完整版本: Assembly language 检测点2.3