. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
主题 : :  【实验5】第五小题两种解法  [待解决] 回复[ 32次 ]   点击[ 1079次 ]  
regex
[帖 主] [ 发表时间:2010-01-09 12:01 ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
1, 利用三个段空间,DS,ES,SS来实现将a段和b段之和存入c段的目的

D:\ASM>type lab55.asm
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 ax,c
        mov ss,ax
        mov sp,0

        mov bx,0
        mov cx,8

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

        mov ah,4ch
        int 21

code    ends
end     start

D:\ASM>
实验结果:
-d ds:0 7
14D9:0000  01 02 03 04 05 06 07 08                           ........
-d es:0 7
14DA:0000  01 02 03 04 05 06 07 08                           ........
-d ss:0 7
14DB:0000  00 00 00 00 00 00 00 00                           ........
程序结束后:
-d ds:0 7
14D9:0000  01 02 03 04 05 06 07 08                           ........
-d es:0 7
14DA:0000  01 02 03 04 05 06 07 08                           ........
-d ss:0 7
14DB:0000  02 04 06 08 0A 0C 0E 10                           ........
-

----------------------------------------------------------------------
第二种方法, 利用两个短, 来实现目的。通过观察,a段和b段相连,所以呢, 可以把ab两段合二为一, 然后利用偏移,使程序精简了些


D:\ASM>
D:\ASM>
D:\ASM>
D:\ASM>type lab55a.asm
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 bx,0
        mov cx,8

s:      mov ax,[bx]
        add ax,[bx+10h]
        mov es:[bx],ax
        inc bx
        loop s

        mov ah,4ch
        int 21

code    ends
end     start

D:\ASM>

实验结果:


AX=14C6  BX=0000  CX=004F  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C4  ES=14C6  SS=14C4  CS=14C7  IP=000D   NV UP EI PL NZ NA PO NC
14C7:000D B90800        MOV     CX,0008
-d ds:0 1f
14C4:0000  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
14C4:0010  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
-d es:0 7
14C6:0000  00 00 00 00 00 00 00 00                           ........
-g 1b

AX=0010  BX=0008  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C4  ES=14C6  SS=14C4  CS=14C7  IP=001B   NV UP EI PL NZ NA PO NC
14C7:001B B44C          MOV     AH,4C
-t

AX=4C10  BX=0008  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C4  ES=14C6  SS=14C4  CS=14C7  IP=001D   NV UP EI PL NZ NA PO NC
14C7:001D CD15          INT     15
-p

AX=8610  BX=0008  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C4  ES=14C6  SS=14C4  CS=14C7  IP=001F   OV UP EI NG NZ NA PE CY
14C7:001F 7405          JZ      0026
-d ds:0 1f
14C4:0000  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
14C4:0010  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
-d es:0 7
14C6:0000  02 04 06 08 0A 0C 0E 10                           ........
-
-
masmaster
[第22楼] [ 回复时间:2010-07-13 16:33 ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
这道题没人用堆栈?……真是……
------------------
回复:
我来用栈
-----------------------------------------------------------------------------------------
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 ax,0
        mov bx,0
        mov cx,8
s1:     mov al,[bx]
        add al,[bx+10h]
        push ax        ;结果入栈保存。
                       ;dos默认给没有设定栈段的程序128个字节,所以就不需要定义栈段。
                       ;如果需要, 还是要定义栈段的。
        inc bx
        loop s1

        mov bx,7       ;为了保持数据一致, 所以bx=7
        mov cx,8
s2:     pop ax         ;从栈中逐个取出数据
        mov es:[bx],al
        dec bx
        loop s2

        mov ah,4ch
        int 21
code    ends
end     start
-----------------------------------------------------------------------------------------
测试结果:

d:\ASM>debug sy55.exe
-t

AX=14C9  BX=0000  CX=005D  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14B9  ES=14B9  SS=14C9  CS=14CC  IP=0003   NV UP EI PL NZ NA PO NC
14CC:0003 8ED8          MOV     DS,AX
-t

AX=14C9  BX=0000  CX=005D  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C9  ES=14B9  SS=14C9  CS=14CC  IP=0005   NV UP EI PL NZ NA PO NC
14CC:0005 B8CB14        MOV     AX,14CB
-t

AX=14CB  BX=0000  CX=005D  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C9  ES=14B9  SS=14C9  CS=14CC  IP=0008   NV UP EI PL NZ NA PO NC
14CC:0008 8EC0          MOV     ES,AX
-t

AX=14CB  BX=0000  CX=005D  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C9  ES=14CB  SS=14C9  CS=14CC  IP=000A   NV UP EI PL NZ NA PO NC
14CC:000A B80000        MOV     AX,0000
-d ds:0 2f
14C9:0000  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
14C9:0010  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
14C9:0020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
-g 29

AX=0002  BX=FFFF  CX=0000  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14C9  ES=14CB  SS=14C9  CS=14CC  IP=0029   NV UP EI NG NZ AC PE NC
14CC:0029 B44C          MOV     AH,4C
-d ds:0 2f
14C9:0000  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
14C9:0010  01 02 03 04 05 06 07 08-00 00 00 00 00 00 00 00   ................
14C9:0020  02 04 06 08 0A 0C 0E 10-00 00 00 00 00 00 00 00   ................
-
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved