. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验5 (5)  [待解决] 回复[ 7次 ]   点击[ 478次 ]  
leonmsi
[帖 主]   [ 发表时间:2007-10-20 01:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-10 19:41
思路:将a段和b段依次相加结果存入a段,再将a段值赋给c段。
代码如下:

assume cs:code
a segment
        db 1,2,3,4,5,6,7,8
a ends
b segment
        db 1,2,3,4,5,6,7,8
b ends
c segment
        db 0,0,0,0,0,0,0,0
c ends
 

code segment
   start:
         mov ax,a
         mov ds,ax

         mov ax,b
         mov es,ax

         mov bx,0
         mov cx,8

      s1:mov ax,es:[bx]
         add [bx],ax

         add bx,2
         loop s1

         mov ax,c
         mov ds,ax

         mov ax,a
         mov es,ax

         mov bx,0
         mov cx,8
      s2:
         mov ax,es:[bx]
         add [bx],ax
         add bx,2
         loop s2

         mov ax,4c00h
         int 21h
     code ends
     end start

debug加载后,可看到a段地址为13c6,b段地址为13c7,c段地址为13c8
-d 13c8:0 7
结果是正确的。

问个问题:
编译连接后得到的exe文件,我不debug **.exe,而是command中直接运行后,
再在debug下输入:-d 13c8:0 7
能否得到:02 04 06 08 0A 0C 0E 10这个结果?
Wednesday
[第1楼]   [ 回复时间:2007-10-20 09:50 ]   [引用]   [回复]   [ top ] 
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53
我试了,你试了吗?
cxn
[第2楼]   [ 回复时间:2007-10-20 10:00 ]   [引用]   [回复]   [ top ] 
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18
我试了,你试了吗?
------------------
回复:谁试谁知道! 哈哈.
Wednesday
[第3楼]   [ 回复时间:2007-10-20 11:00 ]   [引用]   [回复]   [ top ] 
荣誉值:43
信誉值:3
注册日期:2007-07-05 19:53
首先说由command 加载后在内存中的位置是不可预知的。当然你在程序中实现打印程序各段的地址(段地址:偏移地址)到屏幕上的功能,这样就能看明白了。

我改进了程序,在最后调用了打印各段段地址的功能(段的起始偏移地址皆是0,有疑惑的朋友可以讨论)。
command下执行程序 a.exe 。系统为a.exe的各段分配的段地址显示在屏幕中;
然后立即调用执行debug,利用 d 命令查看内存相应位置的内容,

结论自明:
在此我们至少可以说,从程序 a.exe 执行完毕返回到command开始,到加载debug.exe执行命令d时刻为止,这个时间段中系统做了什么我们不得而知,这就无法保证a.exe执行过程中对内存的改动不被覆盖。

详细请参考:
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=1575&kindLevel=1&kindId=1026&postId=2210&readSg=1
cxn
[第4楼]   [ 回复时间:2007-10-20 11:50 ]   [引用]   [回复]   [ top ] 
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18
当程序退出后,程序所占用的内存空间就被释放了,这段内存空间就被系统管理了.如果此时加载其它程序就有可能占用原来的空间,原来的数据就有可能被覆盖.
所以上一个程序被不被覆盖还要看当时的内存占用情况.
举个例子 就好像你在教室讲课写下了板书,你下课了,至于板书被不被擦掉就要看下一节课有没有占用这个教室上课,或者制度有没有让人下课后就擦黑板的.总之黑板不归你用了你也管不着了.
caoheqian
[第5楼]   [ 回复时间:2007-10-29 20:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-09-30 21:53
哪里有毛病啊???
assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends
b segment 
  db 1,2,3,4,5,6,7,8
b ends
c segment 
  db 0,0,0,0,0,0,0,0
c ends
code segment
start:
  mov bx,0
  mov cx,8
  s:
  mov ax,a
  mov ds,ax
  mov ax,[bx]
  mov dx,b
  mov ds,dx
  mov dx,[bx]
  mov ax,dx
  mov dx,c
  mov ds,dx
  mov [bx],al
  inc bx
  loop s
   
  mov ax,4c00h
  int 21h
code ends
end start
caoheqian
[第6楼]   [ 回复时间:2007-10-29 20:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-09-30 21:53
曹家睿
caoheqian
[第7楼]   [ 回复时间:2007-10-29 21:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-09-30 21:53
做了两个批处理文件,献给大家:
a.bat:
masm 1;
link 1;
cls
//asm

d.bat:
cls
debug 1.exe
//debug

ad.bat
masm 1;
link 1;
cls
debug 1.exe

星期三是高手啊。我觉得assembler就是王爽。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved