鱼C论坛

 找回密码
 立即注册
查看: 1657|回复: 7

~~~~~~~ 汇编检测点 3.1求耐心解释~~~~~~~=-=-=-= = -= -=- = -= = -= -

[复制链接]
发表于 2013-11-24 11:54:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么执行 MOV AX,[0000] 之后AX的值不是8070而是2662? 为什么执行的内容不是第一行而是第二行的内容?
个人疑问以及疑问的由来。。。
前俩条指令:
MOV AX,1 :将1移动到AX通用寄存器中,
MOV DS,AX:将通用寄存器AX的值赋给DS段寄存器。
那么,MOV AX,[0000]:将段地址为0000的值赋给AX。
这个MOV AX,[0000]中的段寄存器和地址就是MOV AX,0001:[0000],
因为前面的俩条指令AX=1和DS=AX=1,所以DS的值是1
可是,题目里写的是0000:0000和0000:0010,
就算是DS的值是0000:[0001]也不对啊!
MOV AX,[0001]这个样子才对嘛。
还有就是最后王爽在最后写的提示:注意 ds 的设置。原本没觉得有啥特别的,不过自从有了这句友情提示就不淡定了。。

还有就是我的debug为什么连指令都输不完就退出了?安卓上也是,在VMware中dos6.22直接崩溃了。。
还好重启了系统没坏O(∩_∩)O~。。
求辟邪。。。

下面是我的指令 和 个人注释
检测点3.1
(1)  在DEBUG中,用 "D 0:0 lf" 查看内存,结果如下:  
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 80 12 66 20 22 60  
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88  

win+R debug
-e E命令写入内存
-e 0000:0000 70 80 f0 30 ef 60 30 e2 00 80 80 12 66 20 22 60
-e 0000:0010 62 26 e6 d6 cc 2e 3c 3b ab ba 00 00 26 06 66 88
-r R命令查看CS:IP的值,发现不对,改
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2C  ES=0B2C  SS=0B2C  CS=0B2C  IP=0100   NV UP EI PL NZ NA PO NC
0B2C:0100 C796007403BB  MOV     WORD PTR [BP+7400],BB03            SS:7400=000
-r cs 改CS值为0000
CS 0B2C
:0000
-r ip 改ip值为0000
IP 0100
:0000
-r 这回 CS:IP的指向地方就没问题了,因为要指向0000:0000 内存嘛 ^v^
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B2C  ES=0B2C  SS=0B2C  CS=0000  IP=0000   NV UP EI PL NZ NA PO NC
0000:0000 7080          JO      FF82
-a 0000:0000 在0000:0000内存里写代码
0000:0000 mov ax,1
0000:0003 mov ds,ax
0000:0005 mov ax,[0000]
0000:0008 mov bx,[0001]
0000:000C mov ax,bx
0000:000E mov ax,[0000]
0000:0011 mov bx,[0002]
0000:0015 add ax,bx
0000:0017 add ax,[0004]
0000:001B mov ax,0
0000:001E mov al,[0002]
然后就退出了。。。
求辟邪啊。。。怎么试怎么退出。。求不退出的方法!!!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-24 18:21:38 From FishC Mobile | 显示全部楼层
顶。。。。。有谁知道为什么么???快晕死了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-25 10:16:18 | 显示全部楼层
本帖最后由 dancene 于 2013-11-25 10:19 编辑

首先要明确2个概念,
1:地址 = 段地址*16+偏移地址
2:16进制的数,乘以16,意味着该数左移一位。
详见书本第二章2.7,2.8两节

MOV AX,1
MOV DS,AX          这里DS = 0001H
MOV AX,[0000]    这里指令就是读取内存地址00010H处的内容到AX
为什么是00010H?(注:DS*16+[ADDRESS]   0001H * 16 + 0000H = 00010H)

题目给的 0000:0000 和 0000:0010 这两个地址分别为
0000H*16 + 0000H = 00000H
0000H*16 + 0010H = 00010H
--------------------------------------------------------------------------------
0000:0000 这行列出了 00000H到0000FH这16个内存单元的内容
0000:0010 这行列出了 00010H到0001FH这16个内存单元的内容
--------------------------------------------------------------------------------

上面废话比较多,最终表达的意思就是,MOV AX,[0000] ,这句代码,
读取 00010H处的2个字节 内容为 62(低) 和 26(高) 即:2662H

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-25 10:19:34 | 显示全部楼层
不要修改CS和IP的初始值,0000:0000~0000:03FF是中断向量表的映射地址,不要随便修改!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-25 10:38:45 | 显示全部楼层
还有,楼主,
你之所以自己Debug结果不对,是因为
你把内存中的数据和代码写到一起了!
你用E命令,把
0000:0000 70 80 f0 30 ef 60 30 e2 00 80 80 12 66 20 22 60
0000:0010 62 26 e6 d6 cc 2e 3c 3b ab ba 00 00 26 06 66 88
这些内容写入地址为
00000 到 0001F 这32个内存单元。。
然后你用A命令把代码也写入相同的内存地址,
导致之前E命令编辑内容被覆盖掉了.......

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-26 17:20:50 From FishC Mobile | 显示全部楼层
dancene 发表于 2013-11-25 10:38
还有,楼主,
你之所以自己Debug结果不对,是因为
你把内存中的数据和代码写到一起了!

哦哦!感谢!!我还以为写的数据和代码是俩回事呢。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-26 17:22:13 From FishC Mobile | 显示全部楼层
dancene 发表于 2013-11-25 10:16
首先要明确2个概念,
1:地址 = 段地址*16+偏移地址
2:16进制的数,乘以16,意味着该数左移一位。

照你这么一说还真是!!x16左移一位都扔脑后了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-26 17:23:08 From FishC Mobile | 显示全部楼层
qq348093088 发表于 2013-11-25 10:19
不要修改CS和IP的初始值,0000:0000~0000:03FF是中断向量表的映射地址,不要随便修改!

嗯嗯!不休改了。。。改了结果很郁闷。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 17:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表