鱼C论坛

 找回密码
 立即注册
查看: 2342|回复: 1

新手求助,关于LEA的使用

[复制链接]
发表于 2011-12-14 14:21:33 | 显示全部楼层 |阅读模式

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

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

x
题目:试从jay单元开始存放两个无符号的字节数,将大数送往max单元。

我写的程序:
data segment
jay db 12h,34h
max db ?
data ends

code segment
assume ds:data,cs:code
start:mov ax,data
      mov ax,ds
          lea bx,jay
          mov al,[bx]
          cmp al,[bx+1]
          ja next
          mov bl,[bx+1]
          mov max,bl
          jmp exit
next:mov max,al
     
exit:mov ah,4cH
         int 21h
code ends
   end start



但是定义的数据总是在DS:100开始,而载入的JAY的偏移地址从ds:000开始。
怎么修改呢?
请大家指点迷津。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-20 13:55:27 | 显示全部楼层
这个,代码段第二行资料流向写反了,

mov ax,ds

如此一来ds寄存器的值给了ax,那麽一开始mov ax,data就形同虚设了
改为mov ds,ax就正常了

定义的数据总是在DS:100开始

这个应该是因为ds寄存器初始时是指向PSP(ProgramSemgentPrefix)
(应该是吧??记得鱼老师好像是在非常前段的课程里跟着课本稍微提到)
这个PSP结构共256个字节(16进制就是0x100),後面跟着的才是我们自己定义的各个段,
但是因为你代码的bug导致ds寄存器没有指向data段,所以才会有这0x100的差距

你的源碼先是定義了data段,然後是code段,因此在記憶體的分布應該就是
ds:0000
...                     [PSP结构]共256字节
ds:00ff            
ds:0100           [data段开始]

一开始调试还怀疑是不是自己该重头读起了,怎麽调试ds:0000内容竟然不是12 34 ... ...
後来才恍然大悟只是代码里的bug,呵呵.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-8 18:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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