. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  检测点9.1(3)疑惑中,请高手解答  [已解决] 回复[ 4次 ]   点击[ 554次 ]  
tinyparticle
[帖 主]   [ 发表时间:2009-07-27 22:54 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
用Debug查看内存,结果如下:
2000:1000 BE 00 06 00 00 00 ......
则此时,CPU执行指令:
mov ax,2000h
mov es,ax
jmp dword ptr es:[1000h]
后,(cs)=?,(ip)=?

jmp dword ptr为段间转移,高位存放段地址,低位存放偏移地址
(cs)=(内存单元地址+2),(ip)=(内存单元地址)

疑问一:
根据书P16,对于寄存器AX,AH为高位,AL为低位,前1字节为高位,后1字节为低位
那么对于书P182,高位存放段地址,低位存放偏移地址
(cs)=(内存单元地址+2),(ip)=(内存单元地址)
前2个字节为低位,后2个字节为高位,怎么理解

据书P16,推算出(cs)=00beh,(ip)=0006h
据书P182,推算出(cs)=0006h,(ip)=00beh



疑问二:
尝试用debug跟踪,出现错误,debug给出的答案是(cs)不变,(ip)=1000h


Microsoft(R) Windows DOS
(C)Copyright Microsoft Corp 1990-2001.

C:\DOCUME~1\SNUSER>debug
-r es
ES 0BF9
:2000
-e 2000:1000 be 00 06 00 00 00
-a
0BF9:0100 mov ax,2000
0BF9:0103 mov es,ax
0BF9:0105 jmp dword ptr es:[1000]
                        ^ Error
0BF9:0105 jmp dword ptr 2000:1000
0BF9:0108
-r
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0BF9  ES=2000  SS=0BF9  CS=0BF9  IP=0100   NV UP EI PL NZ NA PO NC
0BF9:0100 B80020        MOV     AX,2000
-t

AX=2000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0BF9  ES=2000  SS=0BF9  CS=0BF9  IP=0103   NV UP EI PL NZ NA PO NC
0BF9:0103 8EC0          MOV     ES,AX
-t

AX=2000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0BF9  ES=2000  SS=0BF9  CS=0BF9  IP=0105   NV UP EI PL NZ NA PO NC
0BF9:0105 E9F80E        JMP     1000
-t

AX=2000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0BF9  ES=2000  SS=0BF9  CS=0BF9  IP=1000   NV UP EI PL NZ NA PO NC
0BF9:1000 E475          IN      AL,75
-
tsembrace
[第1楼]   [ 回复时间:2009-07-27 23:52 ]   [引用]   [回复]   [ top ] 
荣誉值:31
信誉值:3
注册日期:2009-06-15 19:20
疑问一:
LZ说的两种高低位不是一回事,AX的高低位是针对数字而言的,AH和AL的关系别就像十进制数字68,6是高位,8是低位。而这里所说的是针对内存单元的地址而言的,在内存单元里是由低位及高位依次排列的。
有时候一些问题换个时候再去想或许就能豁然开朗了。
疑问二:
也是我的疑问,但应该不需要深究,这里可能就是debug里a命令的问题。
试着将如下程序编译,单步跟踪:
assume cs:codesg
codesg segment
   mov ax,2000H
   mov es,ax
   mov bx,1000h
   mov word ptr es:[bx],00beh
   mov word ptr es:2[bx],0006h
   jmp dword ptr es:[1000h]
   mov ax,4c00H
   int 21H
codesg ends
end
你会发现jmp dword ptr '内存单元'这一指令是没有问题的,同时改变了cs:ip.
同时注意一下jmp dword ptr es:[1000h]在跟踪过程中机器码对应实际指令为'jmp far...'
而直接用debug里的a 命令写出来的jmp dw ptr在跟踪过程中机器码对应实际指令为'jmp..';这一发现也可以猜出对于这一实验,用a命令去写指令是不合适的;
当然,至于a命令的写入指令为什么会造成这个现象~我帮你顶一下,有知道的高人给咱说个大概我想也就ok.
mywiil
[第2楼]   [ 回复时间:2009-07-28 09:42 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:4
注册日期:2008-10-14 16:29
我把我的看法发表到你的博客里了。看看对你有没有帮助。
tinyparticle
[第3楼]   [ 回复时间:2009-07-28 18:34 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
谢谢众位高手,很有帮助,对相关疑问已有答案,我现在去好好消化下
tinyparticle
[第4楼]   [ 回复时间:2009-07-28 18:36 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
此贴由 贴主 于 [ 2009-07-28 18:36 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(tsembrace):2分   2楼(mywiil):4分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved