. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->更灵活的定位内存地址的方法
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  检测`(?/)  [待解决] 回复[ 7次 ]   点击[ 606次 ]  
xuan214
[帖 主]   [ 发表时间:2009-03-15 03:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-02-22 23:57
生成EXE之后用Debug加载后,查看寄存器内容如下:  
    ds=0b2d es=0b2d ss=0b3d cs=0b3e ip=0000  
    程序的起始地址的段地址是_____。  
 1、 0b3e  
 2、 0b2d  
 3、 0b3d  
 4、 0
 

这题怎么没有给出源程序`? 我认为没有源程序是做不出来的`
我的看法如下:一句话 融会了我的精华啊 ~.~
:因为不知道程序的数据段定义了几个字节`所以不知道!
我在做后面几个实验的时候`发现定义的数据直接影响了指令执行的段地址` 因为debug加载的时候要为定义的数据提供内存空间`而我们要执行的指令是在这些空间后面的`所以当数据过大时,不仅会影响偏移地址,还是影响段地址,所以`这道题我认为没有源程序是做不出来的```不知道对不对额``~>.<~ 有砖头就仍吧``
abob
[第1楼]   [ 回复时间:2009-03-15 17:12 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
还记得第四章讲过的psp吗?
xuan214
[第2楼]   [ 回复时间:2009-03-15 20:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-02-22 23:57
记得啊``PSP是在内存和程序的中间`用来他们通信的``SA+10H:0 是程序运行的的起始地址``啊!我们定义的那些数据全在内存里面? 所以程序的起始地址的段地址就是DS+10H? 那为什么在后面的例子中 我用DEBUG查看时定义的那些数据还是会影响到程序的起始地址的``即DS的值不等于DS+10H```
ilove
[第3楼]   [ 回复时间:2009-03-16 10:58 ]   [引用]   [回复]   [ top ] 
荣誉值:14
信誉值:2
注册日期:2008-10-19 21:37
记得啊``PSP是在内存和程序的中间`用来他们通信的``SA+10H:0 是程序运行的的起始地址``啊!我们定义的那些数据全在内存里面?
-----------------------------
为什么是问号呢?第四章不是讲过程序怎么载入内存的吗?代码写完了只是数据,一个小小的文件,编译连接之后行程exe也是如此,只有载入内存才能被执行。(debug载入也是一种方式,直接在dos下运行也是一种方式)

 所以程序的起始地址的段地址就是DS+10H? 那为什么在后面的例子中 我用DEBUG查看时定义的那些数据还是会影响到程序的起始地址的``即DS的值不等于DS+10H```
------------------
回复:不懂楼主的意思,debug加载DS后,ds的值是代表程序的起始地址(首先这个设定是debug预定的,如果用别的工具调试就不一定了)。
如果楼主说的是有点程序中改变的ds的值,而使ds不执行程序的起始了,只能说楼主对第四章那部分知识还没理解明白。ds只是在debug加载后它的只才具有的这个意义。后面是否有人修改它跟他没有关系。

再者,这是debug载入程序设定了ds cx的值,那么如果我们直接在dos下运行xx.exe,是否这些寄存器还有这样的意义呢?我还不知道 O(∩_∩)O~
xuan214
[第4楼]   [ 回复时间:2009-03-17 00:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-02-22 23:57
我不知道有没有理解错``但是我有实验啊``也有截图`我可以截图给你看啊`555 算了``我把例子写出来吧`
第一个例子:assume cs:code,ds:data,ss:stack
data segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbah,0987H
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00H
int 21H
code ends
end 

-r
ax=0000 bx=0000 cx=0042 dx=0000 sp=0000 bp=0000 si=0000 ....
ds=0c42 es=0c42 ss=0c52 cs=0c52 ip=0000 NV UP EI PL .... 
0c52:0000 2301 AND ax,[bx+di]
第二个例子 我加了start:
assume cs:code,ds:data,ss:stack
data segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbah,0987H
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00H
int 21H
code ends
end start

ax=0000 bx=0000 cx=0042 dx=0000 sp=0000 bp=0000 si=0000 ....
ds=0c42 es=0c42 ss=0c52 cs=0c54 ip=0000 NV UP EI PL .... 
0c54:0000 b8530c    mov ax,0c53 
  出来的结果不同啊 第一个是0c52第二是0c54       .........来人啊```真的好希望能得到解答```
acool
[第5楼]   [ 回复时间:2009-03-17 10:41 ]   [引用]   [回复]   [ top ] 
荣誉值:49
信誉值:0
注册日期:2008-10-15 16:15
0c52:0000 2301 AND ax,[bx+di] 
0c54:0000 b8530c    mov ax,0c53 
------------
楼主注意到这个没有,为什么这两条指令不一样呢,上面的and指令是哪里的呢?and指令是你定义的数据段数据,被当作指令对应的汇编指令。
这个问题从第五章开始讲start就涉及到了,第六章的实验也都是这类的程序,用debug加载分析的。楼主要注意前言提到的“两个必须”,不要着急,学会才是根本。

并且这个问题已经不是楼主最开始发的问题了,“程序的起始地址的段地址”不一定是代码段的段地址。
zjxiaogaoren
[第6楼]   [ 回复时间:2009-04-29 19:25 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2009-04-20 20:16
源程序如下(这个就是实验5第3题的程序) 
assume cs:code,ds:data,ss:stack 
code segment 
start:mov ax,stack 
      mov ss,ax 
      mov sp,16 
      mov ax,data 
      mov ds,ax 
      push ds:[0] 
      push ds:[2] 
      pop ds:[2] 
      pop ds:[0] 
      mov ax,4c00h 
      int 21h 
code ends 

data segment 
  dw 0123h,0456h 
data ends 

stack segment 
  dw 0,0 
stack ends 
end start

C:\assemble language>debug 53.exe
-r
AX=0000  BX=0000  CX=0044  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=1405  ES=1405  SS=1415  CS=1415  IP=0000   NV UP EI PL NZ NA PO NC
1415:0000 B81914        MOV     AX,1419
-d 1405:0000
1405:0000  CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 0B 0E 8A 03   当debug加载时,PSP所在位置(CD 20特征说明),
1405:0010  0B 0E 17 03 0B 0E FA 0D-01 01 01 00 02 FF FF FF   发现了PSP所在内存区的段地址为1405,和一开始
1405:0020  FF FF FF FF FF FF FF FF-FF FF FF FF B8 13 4C 01   的DS是相等的印证了:第四章中P92页中(1)(2)
1405:0030  CB 12 14 00 18 00 05 14-FF FF FF FF 00 00 00 00   但是随着程序的指令的执行,DS的内容会发生改变
1405:0040  05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   (mov ax,data  mov ds,ax),但是PSP所在内存区
1405:0050  CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20   的段地址=PSP的起始地址的段地址,表示同一个意思,
1405:0060  20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20   所以第四章中只说成PSP的段地址
1405:0070  20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00   
-d 1415:0000
1415:0000  B8 19 14 8E D0 BC 10 00-B8 18 14 8E D8 FF 36 00   以下是code段的字节内容
1415:0010  00 FF 36 02 00 8F 06 02-00 8F 06 00 00 B8 00 4C   
1415:0020  CD 21 00 00 00 00 00 00-00 00 00 00 00 00 00 00   
1415:0030  23 01 56 04 00 00 00 00-00 00 00 00 00 00 00 00   这16个字节是data段的字节内容
1415:0040  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   这16个字节是stack段的字节内容
从上面我们得出,当debug加载之初,PSP的段地址就是DS,而程序的起始地址的段地址DS+10H,
再来分析CS和IP是由end 标号 指明入口地址,即决定了CS和IP,但是CS不能反过来决定PSP,
PSP的段地址=CS-10H,这是错误的;并且我们发现下面SS等于CS,但这个也是错误
(这里刚好把程序代码段放在第一个段,才出现这样的情况),下面我用一个程序证明这两者:
assume cs:code, ds:data 

data segment 
    db 1 
data ends 

code segment 
        start:    mov ax, data 
                mov ds, ax 
                mov bx, cs 
                sub ax, bx  
code ends 

end start 
C:\assemble language>debug t2.exe
-r
AX=0000  BX=0000  CX=0019  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=1405  ES=1405  SS=1415  CS=1416  IP=0000   NV UP EI PL NZ NA PO NC
1416:0000 B81514        MOV     AX,1415
-d 1405:0000
1405:0000  CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 0B 0E 8A 03   这里也证明了当debug加载时,PSP的段地址=DS
1405:0010  0B 0E 17 03 0B 0E FA 0D-01 01 01 00 02 FF FF FF
1405:0020  FF FF FF FF FF FF FF FF-FF FF FF FF B8 13 4C 01
1405:0030  CB 12 14 00 18 00 05 14-FF FF FF FF 00 00 00 00
1405:0040  05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1405:0050  CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20
1405:0060  20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20
1405:0070  20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00
我们发现当debug加载之初,PSP的段地址=CS-10H 是一种错误的说法,同时也发现SS不等于CS
那么当debug加载之初,各个段寄存器应该是怎么样的情况呢,通过以上分析比较,我觉得:
当debug加载之初,
(1)DS由系统分配内存时决定的
(2)ES是不是一定等于DS,从上面的例子和我所做的其他实验,都发现是相等的,但值得讨论
(3)CS是由end 标号 指明的,如果没有指明那么就由DS+10H指明
(4)SS呢,从上面的例子和我所做的其他实验,都发现SS好象就是程序的起始地址的段地址,也值得讨论
最后能够肯定的是:
当debug加载之初时
   程序所在内存区的段地址指的就是PSP的段地址,或者说就是等于DS
   程序的起始地址的段地址=程序所在内存区的段地址-10H(PSP的256个字节),或者说就是等于DS+10H
qq004455
[第7楼]   [ 回复时间:2009-05-02 19:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-01 15:12
3
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved