第一次debug,遇到的一个小疑问

fanever 2004-11-04 03:47:19
data segment
source_buffer db 40 dup('a')
data ends

extra segment
dest_buffer db 40 dup('?')
extra ends


code segment

main proc far
assume cs:code, ds:data, es:extra

start:
push ds
sub ax, ax
push ax

mov ax, data
mov ds, ax
mov ax, extra
mov es, ax

lea si, source_buffer
lea di, dest_buffer
...
----------------------------------------------------------------------

-d 0 120
13E8:0000 CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 F4 0D 8A 03
13E8:0010 F4 0D 17 03 F4 0D E3 0D-01 01 01 00 02 FF FF FF
13E8:0020 FF FF FF FF FF FF FF FF-FF FF FF FF A1 13 4C 01
13E8:0030 B4 12 14 00 18 00 E8 13-FF FF FF FF 00 00 00 00
13E8:0040 05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
13E8:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20
13E8:0060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20
13E8:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00
13E8:0080 00 0D 74 65 73 74 2E 65-78 65 0D 41 53 54 45 52
13E8:0090 3D 41 30 0D 64 64 72 65-73 73 2E 20 20 46 6F 72
13E8:00A0 20 65 78 61 6D 70 6C 65-3A 0D 20 6F 6E 20 4E 54
13E8:00B0 56 44 4D 2C 20 73 70 65-63 69 66 79 20 61 6E 20
13E8:00C0 69 6E 76 61 6C 69 64 0D-20 6F 6E 6C 79 2E 0D 00
13E8:00D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
13E8:00E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
13E8:00F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
13E8:0100 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 // 这一行
13E8:0110 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61
13E8:0120 61

而反编译
-u
13FE:0000 1E PUSH DS
13FE:0001 2BC0 SUB AX,AX
13FE:0003 50 PUSH AX
13FE:0004 B8F813 MOV AX,13F8
13FE:0007 8ED8 MOV DS,AX
13FE:0009 B8FB13 MOV AX,13FB
13FE:000C 8EC0 MOV ES,AX
13FE:000E 8D360000 LEA SI,[0000] // 这一行
13FE:0012 8D3E0000 LEA DI,[0000]
...


问题:
DS = 13FE,但为什么13FE:0000的内容不是'a',反而13FE:0100才是'a'呢??
...全文
243 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamroc 2004-11-10
  • 打赏
  • 举报
回复
附:
13E8:0100 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61 // 这一行
13E8:0110 61 61 61 61 61 61 61 61-61 61 61 61 61 61 61 61
13E8:0120 61

从100开始这里应该是堆栈

这个本人的看法,如有误,还请各位指出
iamroc 2004-11-10
  • 打赏
  • 举报
回复
本人太笨,没有看懂你问的问题,但是。。。
首先,DS不会等于13FE,因为13FE是CS的段。其次,lea si, source_buffer 是将a的有效地址传给SI,再根据13FE:000E 8D360000 LEA SI,[0000] 这一行,估计a应该存在DS:0000中,在这里并不知道DS是多少,是由计算机自己分配的。

这个本人的看法,如有误,还请各位指出
csdn_viking 2004-11-10
  • 打赏
  • 举报
回复
13FE:000E 8D360000 LEA SI,[0000] // 这一行
13FE:0012 8D3E0000 LEA DI,[0000]
...
问题:
DS = 13FE,但为什么13FE:0000的内容不是'a',反而13FE:0100才是'a'呢??


我觉得楼主是想问:为什么DS = 13FE,可13FE:0000的内容为什么不是‘a’,因为上面那行是LEA SI,[0000]

楼主啊,你看清楚啊,13FE:000E 8D360000 LEA SI,[0000] // 这一行
说明了CS = 13FE啊!不知道你凭什么说 DS = 13FE呢??你输入t命令执行一下就知道LEA之前的DS等于多少了。
hujiangyongxx 2004-11-08
  • 打赏
  • 举报
回复
默认的CS:100 前面254个字节是PSP,保存着DS,ES.所以你看到的是这样的情况
uglystone 2004-11-05
  • 打赏
  • 举报
回复
同意楼上的意见,
13fe:000e并非是ds的地址而是指令的地址
应该是13f8:0000
kokblack 2004-11-05
  • 打赏
  • 举报
回复
13FE:000E 8D360000 LEA SI,[0000] // 这一行

^13fe:oooe 是程序所在地的段地址:偏移地址
jk88811 2004-11-05
  • 打赏
  • 举报
回复
楼上有道理,我要加分!

这题我不会,不好意思!
koyer 2004-11-04
  • 打赏
  • 举报
回复
13FE 是段地址,我说的100H 是偏移量!!!!!
Areslee 2004-11-04
  • 打赏
  • 举报
回复
可执行文件装入内存时,DS/ES是指向当前进程的PSP的,PSP的尺寸是100H
因此看上去就是DS:100H才是你的代码
csdsjkk 2004-11-04
  • 打赏
  • 举报
回复
ds=13fe???
似乎你看错了
koyer 2004-11-04
  • 打赏
  • 举报
回复
在一个程序被调入内存执行的时候,系统会在程序的前面用一个256个字节(好象叫PNP吧)初始化
DS,ES ,真正的第一条程序代码是在100H 处开始的,所以就是你说的情况!!!
大熊猫侯佩 2004-11-04
  • 打赏
  • 举报
回复
正常啊!默认的程序被 debug 加载到偏移量 100 的位置上。
当然你也可以 指定加载地址:

L [address]
fanever 2004-11-04
  • 打赏
  • 举报
回复
怎么没人答一下呢

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧