. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  试验5:第五题的问题?  [待解决] 回复[ 8次 ]   点击[ 721次 ]  
zslllx
[帖 主]   [ 发表时间:2008-01-20 10:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-12-31 09:39
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 es,ax 
        mov ax,c 
        mov ds,ax 
        mov bx,0 
        mov cx,8 

     s1:mov ax,es:[bx] 
        add [bx],ax 
        add bx,2 
        loop s1 
        mov ax,b 
        mov es,ax 
        mov ds,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 跟踪,用u命令查看是如下结果, 
-u 
13EE:0000 B8EC13        MOV     AX,13EC 
13EE:0003 8ED8          MOV     DS,AX 
13EE:0005 B8ED13        MOV     AX,13ED 
13EE:0008 8EC0          MOV     ES,AX 
13EE:000A BB0000        MOV     BX,0000 
13EE:000D B90800        MOV     CX,0008 
13EE:0010 8B07          MOV     AX,[BX] 
13EE:0012 26            ES: 
13EE:0013 0107          ADD     [BX],AX 
13EE:0015 43            INC     BX 
13EE:0016 E2F8          LOOP    0010 
13EE:0018 B8EB13        MOV     AX,13EB 
13EE:001B 8ED8          MOV     DS,AX 
13EE:001D B8ED13        MOV     AX,13ED 

无法继续。。。。。用g命令: 
-g 1d 

AX=13EB  BX=0008  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000 
DS=13EB  ES=13ED  SS=13EB  CS=13EE  IP=001D   NV UP EI PL NZ NA PO NC 
13EE:001D B8ED13        MOV     AX,13ED 
-g 1e 

Program terminated normally 
这是为什么呢?
tomato
[第1楼]   [ 回复时间:2008-01-20 11:50 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
看了一下,楼主的程序好像有点问题。


 mov ax,b  
        mov es,ax  
        mov ds,ax  
        mov bx,0  
        mov cx,8  

     s2:mov ax,es:[bx]  
        add [bx],ax  
        add bx,2  
        loop s2  
-------------------------
是不是同一个位置的数据自加,并不是加到c段中。
wdm
[第2楼]   [ 回复时间:2008-01-20 12:25 ]   [引用]   [回复]   [ top ] 
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21
建议楼主跟踪的时候一步步的来,G命令一下过去,很难找出问题啊。
negatlov
[第3楼]   [ 回复时间:2008-02-27 23:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-02-24 19:41
楼主,声明的是db哦,,不是dw。。。b每次加1......ax。。是字。题目是字节。。
181763116
[第4楼]   [ 回复时间:2008-03-04 02:40 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:1
注册日期:2008-03-01 17:14
mov ax,b  
        mov es,ax  
        mov ds,ax
把B同时送了附加段和数据段
sysnap
[第5楼]   [ 回复时间:2008-03-04 15:35 ]   [引用]   [回复]   [ top ] 
荣誉值:32
信誉值:0
注册日期:2008-01-15 12:22
从这章前几个题的实验我们可以知道,cpu再给段分配内存空间的时候是以16的倍数分配的。虽然上面的程序段中都只申请了8个字节,但是a段首地址和b段的首地址相差应该是16字节。同样b和c段的首地址之差也应该是16字节。我觉得这个程序利用前几道题我们得出的结论,在得到一个段首地址的情况下去定位其他段应该是个不错的方法。也省去了段地址的多次设定。 
楼主可以试试~
iseaside
[第6楼]   [ 回复时间:2010-05-15 15:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-15 15:02
你这个好像是某个人做的课后题答案吧。好像很多都有错误的。就像这个。不知道是手误还是故意的。
 mov ax,b  
        mov es,ax  
        mov ds,ax   '//这里传到段地址就错了。底下用的add [bx],ax 那就是用ds数据段当做c段来存放结果。之类又把b段传到ds中。= =。真郁闷
        mov bx,0  
        mov cx,8  

     s2:mov ax,es:[bx]
iseaside
[第7楼]   [ 回复时间:2010-05-15 15:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-15 15:02
好像题目上边写着是用db来定义字节的。单个字节。底下是add bx,2 = =+。而且在这章好像没提到db 只有dw。
总体感觉。很乱很乱。
hoodjaxk
[第8楼]   [ 回复时间:2010-05-22 23:01 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-18 14:45
根据LZ的答案改了一下
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 es,ax  
        mov ax,c  
        mov ds,ax  
        mov bx,0  
        mov cx,4  

     s1:mov ax,es:[bx]  
        add [bx],ax  
        add bx,2  
        loop s1  
        
        mov ax,b  
        mov es,ax  
        mov bx,0  
        mov cx,4  

     s2:mov ax,es:[bx]  
        add [bx],ax  
        add bx,2  
        loop s2  
        
        mov ax,4c00h  
        int 21h  

code ends  
  end start  
编译后------------------------------------------------------
Message:
You will be access debug mode! If you want to quit debug mode,
please press key 'q'(or 'Q') and press key 'Enter'.

-u cs:0 32
29A2:0000 B89F29        MOV     AX,299F
29A2:0003 8EC0          MOV     ES,AX
29A2:0005 B8A129        MOV     AX,29A1
29A2:0008 8ED8          MOV     DS,AX
29A2:000A BB0000        MOV     BX,0000
29A2:000D B90400        MOV     CX,0004
29A2:0010 26            ES:
29A2:0011 8B07          MOV     AX,[BX]
29A2:0013 0107          ADD     [BX],AX
29A2:0015 83C302        ADD     BX,+02
29A2:0018 E2F6          LOOP    0010
29A2:001A B8A029        MOV     AX,29A0
29A2:001D 8EC0          MOV     ES,AX
29A2:001F BB0000        MOV     BX,0000
29A2:0022 B90400        MOV     CX,0004
29A2:0025 26            ES:
29A2:0026 8B07          MOV     AX,[BX]
29A2:0028 0107          ADD     [BX],AX
29A2:002A 83C302        ADD     BX,+02
29A2:002D E2F6          LOOP    0025
29A2:002F B8004C        MOV     AX,4C00
29A2:0032 CD21          INT     21
-g 002f

AX=0807  BX=0008  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=29A1  ES=29A0  SS=299F  CS=29A2  IP=002F   NV UP EI PL NZ NA PO NC
29A2:002F B8004C        MOV     AX,4C00
-d ds:0 f(C段的结果)
29A1:0000  02 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00   ................
-d es:0 f
29A0:0000  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
---------------------------------------------------------------------------------
关于循环中 add bx,2
db 申请的1个字节的空间,所以大家都会考虑循环中bx+2,
但是当29A2:0026 8B07 MOV AX,[BX]时,是把0201送到了ax中(ax占16位),
所以29A2:0013 0107 ADD [BX],AX后,C段内容应如下
-d ds:0 f
29A1:0000  01 02 00 00 00 00 00 00-00 00 00 00 00 00 00 00
这也是mov cx,4的原因
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved