. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  我苦思了一个小时做的第六章实验五第五小题  [待解决] 回复[ 36次 ]   点击[ 2863次 ]  
xindalu
[帖 主]   [ 发表时间:2009-10-06 17:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-25 18:08
大家看看我做的对不对,经过调试功能实现.只是觉得方法有前妥当.大家指点一二
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,b 
       mov ds,ax 
       mov bx,0 
       mov cx,8 
 s:    mov ax,es:[bx] 
       add [bx],al 
       add bx,2
       loop s 
       
       mov ax,c 
       mov es,ax 
       mov bx,0 
       mov cx,8 
 s1:   mov ax,[bx] 
       mov es:[bx],ax 
       add bx,2
       loop s1 
       mov ax,4c00h 
       int 21h 
code ends 
end start
tinyparticle
[第1楼]   [ 回复时间:2009-10-06 17:59 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
-u
0C7C:0022 B90800        MOV     CX,0008
0C7C:0025 8B07          MOV     AX,[BX]
0C7C:0027 26            ES:
0C7C:0028 8907          MOV     [BX],AX
0C7C:002A 83C302        ADD     BX,+02
0C7C:002D E2F6          LOOP    0025
0C7C:002F B8004C        MOV     AX,4C00
0C7C:0032 CD21          INT     21
0C7C:0034 16            PUSH    SS
0C7C:0035 3C21          CMP     AL,21
0C7C:0037 8987BE22      MOV     [BX+22BE],AX
0C7C:003B 8997C022      MOV     [BX+22C0],DX
0C7C:003F 803E450700    CMP     BYTE PTR [0745],00
-g002f

AX=0000  BX=0010  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0C7A  ES=0C7B  SS=0C79  CS=0C7C  IP=002F   NV UP EI PL NZ AC PO NC
0C7C:002F B8004C        MOV     AX,4C00
-d 0c79:0 2f
0C79:0000  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
0C79:0010  02 02 06 04 0A 06 0E 08-00 00 00 00 00 00 00 00   ................
0C79:0020  02 02 06 04 0A 06 0E 08-00 00 00 00 00 00 00 00   ................
-测试了下,结果不太对
tinyparticle
[第2楼]   [ 回复时间:2009-10-06 18:14 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
s:    mov ax,es:[bx]  
       add [bx],al  
       add bx,2 
 s1:   mov ax,[bx]  
       mov es:[bx],ax  
       add bx,2 

abc段全是db(字节型)数据,LZ用16位寄存器进行计算会出错的啦
xindalu
[第3楼]   [ 回复时间:2009-10-07 15:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-25 18:08
谢谢指教,下面是我改正后的程序.
第六章实验5第(5)小题
编写code段中的代码,将a段和b段中的数据依次相加,结果存到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 es,ax
       mov ax,c
       mov ds,ax
       mov ax,0
       mov bx,0
       mov cx,8

  s1:  mov al,es:[bx]
       mov [bx],al
       inc bx
       loop s1
       
       mov ax,b
       mov es,ax
       mov ax,0
       mov bx,0
       mov cx,8

  s2:  mov al,es:[bx]
       add [bx],al
       inc bx
       loop s2

       mov ax,4c00h
       int 21h
code ends
end start
tinyparticle
[第4楼]   [ 回复时间:2009-10-10 23:25 ]   [引用]   [回复]   [ top ] 
荣誉值:188
信誉值:4
注册日期:2009-07-05 19:26
更改后没有问题了
auty95
[第5楼]   [ 回复时间:2009-10-26 10:05 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2009-10-09 11:42
为什么要用两个循环啊
xufengshan
[第6楼]   [ 回复时间:2009-10-28 14:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-27 19:48
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 bx,0
       mov cx,8
s:     mov ax,[bx]
       add ax,[bx+16]
       mov [bx+32],ax
       inc bx
       loop s
       mov ax,4c00h 
       int 21h 
code ends 
end start
rockcat
[第7楼]   [ 回复时间:2009-11-01 11:17 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2009-10-28 11:47
呵,楼上方法不错
不过严格说,应该用 al吧?

俺是初学者,请多指教
yiyn
[第8楼]   [ 回复时间:2009-11-12 03:17 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:0
注册日期:2009-10-18 04:41
6楼学到几章了?你这种做法固然正确但我想要是刚学到这里的从来还没见过[bx+32]这种做法吧
有点不符王老师的教学理念了哦
yo_007
[第9楼]   [ 回复时间:2009-11-12 11:04 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2009-10-29 10:41
可以只用一个循环,又不超出6章的范围
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,b  
       mov ds,ax
       mov ax,c
       mov ss,ax  
       mov bx,0  
       mov cx,8  
 s:    mov al,ds:[bx]  
       add al,es:[bx]  
       mov ss:[bx],al
       inc bx 
       loop s  
        
       mov ax,4c00h  
       int 21h  
code ends  
end start
ztf770710
[第10楼]   [ 回复时间:2009-11-12 13:02 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:2
注册日期:2008-01-16 11:01
回复:[第9楼]
------------------
循环前应该加mov ax,0吧
hjq
[第11楼]   [ 回复时间:2009-11-24 12:08 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-10-30 15:46
受益匪浅!
hjq
[第12楼]   [ 回复时间:2009-11-24 12:09 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-10-30 15:46
回复:[第10楼]
------------------
不用加
hay1323
[第13楼]   [ 回复时间:2009-12-16 15:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-20 22:10
个人觉得,要加上mov ax,0,在这里不用加也可得出正确答案,是因为前面赋值未影响到ah,即高位的值也是0,严格地讲,是应该加上的.
ldlihuanfa
[第14楼]   [ 回复时间:2010-01-06 16:36 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53
十楼的方法感觉非常清楚明了
trand
[第15楼]   [ 回复时间:2010-01-06 18:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-14 13:22
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,c
        mov es,ax
        mov cx,8
        mov bx,0
        ;將A段移至C段
s1:        mov al,ds:[bx]
        mov es:[bx],al
        inc bx
        loop s1
        mov ax,b
        mov ds,ax
        mov cx,8
        mov bx,0
        ;將B段與C段累加
s2:        mov al,ds:[bx]
        add es:[bx],al
        inc bx
        loop s2
        mov ax,4c00h
        int 21h
code ends

end start
wtan
[第16楼]   [ 回复时间:2010-01-07 13:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-03 08:56
一个循环就够了,两个实在太浪费了
wtan
[第17楼]   [ 回复时间:2010-01-07 13:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-03 08:56
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 cx,8
        mov bx,0

        mov dx,code
        sub dx,3
        mov ds,dx
        
s:        mov al,0
        mov al,[bx]
        add al,[bx+10h]
        mov [bx+20h],al
        inc bx
        loop s
        
        mov ax,4c00h
        int 21h

code ends

end start
zjkl19
[第18楼]   [ 回复时间:2010-03-24 12:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2009-07-15 11:17
同意13楼,我也是这样想的,编程习惯问题。
zjkl19
[第19楼]   [ 回复时间:2010-03-24 12:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2009-07-15 11:17
参考楼上各位的代码,然后把我自己的代码改改,这样应该符合要求了吧:
assume cs:code

s         segment
        db 1,2,3,4,5,6,7,8
s        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,s
           mov ds,ax
           
           mov ax,b
           mov es,ax
           
           mov ax,c
           mov ss,ax
           mov sp,0
           
           mov bx,0
           mov cx,8
           mov ah,0
           
        x: mov al,ds:[bx]
           add al,es:[bx]
           mov ss:[bx],al
           inc bx
            loop x
        mov ax,4c00h
        int 21h
code ends
end start
lisfan
[第20楼]   [ 回复时间:2010-04-10 18:27 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-12 12:25
9楼的方法不错,,看来规矩是死的,人是活的,只看你用的恰不恰当。
虽然也曾经想到过使用ss,但却没有去实施
swlcf008
[第21楼]   [ 回复时间:2010-04-14 11:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-10-15 09:15
我做的和9楼一样!吼吼!
yx412
[第22楼]   [ 回复时间:2010-04-25 14:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-04-24 12:43
为什么我情况是:存在syntax error : c
jas05
[第23楼]   [ 回复时间:2015-06-04 21:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2015-06-02 09:14
利用a、b、c段的数据是连续的,是否可以利用它们之间的间隔差16和32呢?
6章之前没看到es寄存器的用法。可以不用es、ss寄存器吗?

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 bx,0
        mov cx,8
        mov ax,0
s:      mov al,[bx]
        
        add al,[bx+16]
        mov [bx+32],al
        inc bx
        loop s

        mov ax,4c00h
        int 21h
code ends
end start
li_ayun
[第24楼]   [ 回复时间:2015-12-15 21:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2015-12-15 17:17
回复:[第23楼]
------------------
我想你应该写错了,指令inc bx应该改为add bx,2吧!
18201505886
[第25楼]   [ 回复时间:2017-03-07 20:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2016-12-29 01:01
回复:[第24楼]
------------------
23楼没有错!
luguanghua
[第26楼]   [ 回复时间:2020-05-07 17:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2020-04-10 16:10
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 cx,8;循环次数
       mov bx,0

 s:    mov ax,a  
       mov ds,ax
  
       mov ax,b  
       mov es,ax 

       mov dl,[bx]  
       add dl,es:[bx]  
       
       mov ax,c
       mov ds,ax
       mov [bx],dl
       inc bx

       loop s  
  
       mov ax,4c00h  
       int 21h  
code ends  
end start
在一次循环中可以重复使用ds,使它指向不同的段。
13612823438
[第27楼]   [ 回复时间:2021-05-27 11:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2021-05-27 11:02
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,b
        mov es,ax
        mov bx,0
        mov cx,8

s:
        mov ax,a
        mov ds,ax
        mov ax,0
        mov al,ds:[bx]
        add al,es:[bx]
        mov dx,c
        mov ds,dx
        mov ds:[bx],al
        inc bx
        loop s

code ends

end start
13612823438
[第28楼]   [ 回复时间:2021-05-27 11:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2021-05-27 11:02
上面是自己写的方法,已经验证可以(因为程序最好不要修改栈的段寄存器和指令的段寄存器,所以这里没有修改栈段寄存器ss,没有用到[bx+idata],用到的都是目前学过的方法,就是比较麻烦)
13612823438
[第29楼]   [ 回复时间:2021-05-27 11:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2021-05-27 11:02
和26楼方法重复了
codinv
[第30楼]   [ 回复时间:2022-07-14 10:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2018-10-13 21:08
好方法
trxnb
[第31楼]   [ 回复时间:2022-10-12 13:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2022-10-09 11:54
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
    s:mov al,ds:[100h+bx]
      mov ds:[120h+bx],al
      mov al,ds:[110h+bx]
      add ds:[120h+bx],al
      inc bx
      loop s

      mov ax,4c00h
      int 21h
code ends
end start
trxnb
[第32楼]   [ 回复时间:2022-10-12 13:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2022-10-09 11:54
回复:[第31楼]
------------------
有个问题,没有设置循环次数。。
trxnb
[第33楼]   [ 回复时间:2022-10-12 13:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2022-10-09 11:54
第二种方式
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
      mov ax,a
      mov ds,ax

      mov ax,b
      mov es,ax

      mov ax,c
      mov ss,ax

    s:mov al,ds:[bx]
      mov ss:[bx],al
      mov al,es:[bx]
      add ss:[bx],al
      inc bx
      loop s

      mov ax,4c00h
      int 21h

code ends
end start
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved