鱼A 发表于 2013-11-24 11:54:09

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

为什么执行 MOV AX, 之后AX的值不是8070而是2662? 为什么执行的内容不是第一行而是第二行的内容?
个人疑问以及疑问的由来。。。
前俩条指令:
MOV AX,1 :将1移动到AX通用寄存器中,
MOV DS,AX:将通用寄存器AX的值赋给DS段寄存器。
那么,MOV AX,:将段地址为0000的值赋给AX。
这个MOV AX,中的段寄存器和地址就是MOV AX,0001:,
因为前面的俩条指令AX=1和DS=AX=1,所以DS的值是1
可是,题目里写的是0000:0000和0000:0010,
就算是DS的值是0000:也不对啊!
MOV AX,这个样子才对嘛。
还有就是最后王爽在最后写的提示:注意 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=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0B2CES=0B2CSS=0B2CCS=0B2CIP=0100   NV UP EI PL NZ NA PO NC
0B2C:0100 C796007403BBMOV   WORD PTR ,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=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0B2CES=0B2CSS=0B2CCS=0000IP=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:0008 mov bx,
0000:000C mov ax,bx
0000:000E mov ax,
0000:0011 mov bx,
0000:0015 add ax,bx
0000:0017 add ax,
0000:001B mov ax,0
0000:001E mov al,
然后就退出了。。。
求辟邪啊。。。怎么试怎么退出。。求不退出的方法!!!

鱼A 发表于 2013-11-24 18:21:38

顶。。。。。有谁知道为什么么???快晕死了。。

dancene 发表于 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,    这里指令就是读取内存地址00010H处的内容到AX
为什么是00010H?(注:DS*16+   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, ,这句代码,
读取 00010H处的2个字节 内容为 62(低) 和 26(高) 即:2662H

qq348093088 发表于 2013-11-25 10:19:34

不要修改CS和IP的初始值,0000:0000~0000:03FF是中断向量表的映射地址,不要随便修改!

dancene 发表于 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命令编辑内容被覆盖掉了.......

鱼A 发表于 2013-11-26 17:20:50

dancene 发表于 2013-11-25 10:38
还有,楼主,
你之所以自己Debug结果不对,是因为
你把内存中的数据和代码写到一起了!


哦哦!感谢!!我还以为写的数据和代码是俩回事呢。。。

鱼A 发表于 2013-11-26 17:22:13

dancene 发表于 2013-11-25 10:16
首先要明确2个概念,
1:地址 = 段地址*16+偏移地址
2:16进制的数,乘以16,意味着该数左移一位。


照你这么一说还真是!!x16左移一位都扔脑后了。。

鱼A 发表于 2013-11-26 17:23:08

qq348093088 发表于 2013-11-25 10:19
不要修改CS和IP的初始值,0000:0000~0000:03FF是中断向量表的映射地址,不要随便修改!

嗯嗯!不休改了。。。改了结果很郁闷。。。
页: [1]
查看完整版本: ~~~~~~~ 汇编检测点 3.1求耐心解释~~~~~~~=-=-=-= = -= -=- = -= = -= -