定位内存地址

jikeyuan1 2011-04-05 11:20:32
;将字符串'welcome to masm!'复制到他后面的数据区中
assume cs:codesg, ds:datasg

datasg segment
db 'welcome to masm!'
;db '................'
datasg ends

codesg segment

start: mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s:mov ax,0[si]
mov 32[si],ax ;这儿可以直接写32 为什么结果显示源字符串都改变啦啊 ?? 而且目标字符串也没有完全显示正确?
add si,2
loop s

mov ax,4c00h
int 21h

codesg ends

end start

如题 请高手解决
...全文
109 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
masmaster 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jikeyuan1 的回复:]
我试过debug啦 到 mov [si+32],ax 的时候 显示的代码就变成JA 0077 不知道是什么意思??
请指点
[/Quote]
我按照你的程序,debug到这里的是, 显示的是:MOV [SI+20],AX,下一条是ADD SI,+02.
或许你的debug跟我的debug不一样
jikeyuan1 2011-04-06
  • 打赏
  • 举报
回复
我试过debug啦 到 mov [si+32],ax 的时候 显示的代码就变成JA 0077 不知道是什么意思??
请指点
masmaster 2011-04-06
  • 打赏
  • 举报
回复
debug到int 21h的时候, 按P,
PS:Program terminated normally【程序正常退出】
jikeyuan1 2011-04-06
  • 打赏
  • 举报
回复
还有 在debug中程序没有执行到int 21h,执行到mov ax,4c00h再按下t就直接结束啦 显示Program terminated normally不知道这是为什么 ???
jikeyuan1 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 masmaster 的回复:]

也许你的编译器不支持这样的格式。 换成
mov [si+32],ax
试一试。
[/Quote]
还是不对啊 和没改的时候一样的 请高手解释下
jikeyuan1 2011-04-06
  • 打赏
  • 举报
回复
有没有人啦
masmaster 2011-04-06
  • 打赏
  • 举报
回复
也许你的编译器不支持这样的格式。 换成
mov [si+32],ax
试一试。
masmaster 2011-04-06
  • 打赏
  • 举报
回复
这个程序由于没有显示输出, 所以, 要求的是使用debug去验证! 你自己用debug走一遍,每走一步, 都观察一下DS里的变化!如shzhfu老师所言, 目标地址不要注释掉。
jikeyuan1 2011-04-06
  • 打赏
  • 举报
回复
LS的朋友 你的解释我大致懂了 可是为什么源字符串会改变呢 !!源字符串的地址应该是datasg的开始的那16个单元啊 ???
jikeyuan1 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 shzhfu 的回复:]

朋友,在7楼给你回答过了(见程序中的注释):

;此时ds:32[si]所指的单元恰好是下一句add si,2,所以第一个字符把代码修改了,往下执行的过程就改变了。

本来add si,2的机器码是83 c6 02,其中ds:[32]处是c683H,你执行mov 32[si],ax把这里的机器码换成77 65(‘w‘和’e’),它对应着指令JA 0077 .

(有时辛苦地解答问题,……
[/Quote]

不好意思啊 我刚接触汇编不久 得罪的地方多多包涵的 嘿嘿
shzhfu 2011-04-06
  • 打赏
  • 举报
回复

assume cs:codesg, ds:datasg

datasg segment
db 'welcome to masm!'
;db '................' ;这里应该是目标区域吧?为什么要注释掉?
datasg ends

codesg segment

start: mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s:mov ax,0[si]
mov 32[si],ax
;这儿可以直接写32 为什么结果显示源字符串都改变啦啊 ?? 而且目标字符串也没有完全显示正确?
;此时ds:32[si]所指的单元恰好是下一句add si,2,所以第一个字符把代码修改了,往下执行的过程就改变了。

add si,2
loop s

mov ax,4c00h
int 21h

codesg ends

end start


Lactoferrin 2011-04-06
  • 打赏
  • 举报
回复
(shzhfu) 解释很到位,而你不仔细看。

原因就是datasg不够大,你的数据直接复制到代码段中去了
shzhfu 2011-04-06
  • 打赏
  • 举报
回复
朋友,在7楼给你回答过了(见程序中的注释):

;此时ds:32[si]所指的单元恰好是下一句add si,2,所以第一个字符把代码修改了,往下执行的过程就改变了。

本来add si,2的机器码是83 c6 02,其中ds:[32]处是c683H,你执行mov 32[si],ax把这里的机器码换成77 65(‘w‘和’e’),它对应着指令JA 0077 .

(有时辛苦地解答问题,人家都不看,甚至还有人说我在误导人。)
jikeyuan1 2011-04-05
  • 打赏
  • 举报
回复
自己顶 高手在哪儿啊 !!!

21,459

社区成员

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

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