. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->包含多个段的程序
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  【实验5】第五小题两种解法  [待解决] 回复[ 32次 ]   点击[ 1078次 ]  
regex
[帖 主]   [ 发表时间:2010-01-09 12:01 ]   [引用]   [回复]   [ top ] 
荣誉值: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                           ........
-
-
regex
[第1楼]   [ 回复时间:2010-01-09 12:04 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
-
-
-
-

D:\ASM>debug lab55.exe
-r
AX=0000  BX=0000  CX=0057  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14B4  ES=14B4  SS=14C4  CS=14C7  IP=0000   NV UP EI PL NZ NA PO NC
14C7:0000 B8C414        MOV     AX,14C4
-q

D:\ASM>debug lab55a.exe
-r
AX=0000  BX=0000  CX=004F  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=14B4  ES=14B4  SS=14C4  CS=14C7  IP=0000   NV UP EI PL NZ NA PO NC
14C7:0000 B8C414        MOV     AX,14C4
-q

root@yeah ~
$ echo "ibase=obase=16;57-4F"|bc
8

root@yeah ~
$
regex
[第2楼]   [ 回复时间:2010-01-09 12:05 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
通过对比, 所用代码少了8bytes O(∩_∩)O~
inrg
[第3楼]   [ 回复时间:2010-01-20 00:02 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2007-12-08 14: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 bx, 0
        mov cx, 8
s:
        sub ax, ax
        mov al, ds:[bx]
        sub dx, dx
        mov dl, ds:[bx + 10h]
        add ax, dx
        mov ds:[bx + 20h], ax
        inc bx
        loop s
        
        mov ax, 4c00h
        int 21h
code ends

end start
regex
[第4楼]   [ 回复时间:2010-01-20 00:16 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
呵呵~~~, 够K.I.S.S
pgs
[第5楼]   [ 回复时间:2010-01-26 14:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-12 23:14
楼主在机器上实验了吗?我最初也是用的楼主的第一种方法,但编译通不过,提示error A2008:syntax error : c 及 error A2034:must be in segment block。不知是何原因。

另外,楼主的第一种方法中在开头没有用assume ds:a,es:b,ss,c,这好像不行吧。
regex
[第6楼]   [ 回复时间:2010-01-30 00:40 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
楼主在机器上实验了吗?我最初也是用的楼主的第一种方法,但编译通不过,提示error A2008:syntax error : c 及 error A2034:must be in segment block。不知是何原因。

另外,楼主的第一种方法中在开头没有用assume ds:a,es:b,ss,c,这好像不行吧。
------------------
回复:
可以不用关联的, 我的文件都是实验过的
jude1990
[第7楼]   [ 回复时间:2010-02-06 00:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-31 10:29
楼主方法比我好些 
自己没用附加段寄存器
start: 
      mov ax.a
      mov ds,ax
      mov bx,0
      mov cx,8
  s:  mov ax,0
       add ax,[bx]
       add ax,[bx+10]
       add ax,[bx+20]
       inc bx
       loop s
jude1990
[第8楼]   [ 回复时间:2010-02-06 00:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-31 10:29
楼主方法比我好些 
自己没用附加段寄存器
start: 
      mov ax.a
      mov ds,ax
      mov bx,0
      mov cx,8
  s:  mov ax,0
       add ax,[bx]
       add ax,[bx+10]
       add ax,[bx+20]
       inc bx
       loop s
------------------
回复:打错了
      start: 
      mov ax.a
      mov ds,ax
      mov bx,0
      mov cx,8
  s:  mov ax,0
       add ax,[bx]
       add ax,[bx+10h]
       add [bx+20h],ax
       inc bx
       loop s
superyangyw
[第9楼]   [ 回复时间:2010-02-20 15:41 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-02-13 10:13
我想问一下,用您的代码的确是正确的,但是我对第一种方法有疑问
您用的是整个寄存器操作
        mov ax,[bx]
        add ax,es:[bx]
        mov ss:[bx],ax 
我的理解是:ds:[bx]里的word数据,从内存里读出来应该是0201h,mov ss:[bx],ax的话,栈中存放的就是0402h,也就是说最后的数据会变成04 02 08 06等等
我的理解有什么错误?
ailesargentees
[第10楼]   [ 回复时间:2010-03-21 17:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-02 17:21
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,4 
s:      mov ax,[bx] 
        add ax,es:[bx] 
        mov ss:[bx],ax 
        add bx,2 
        loop s 
        mov ah,4ch 
        int 21 
code    ends 
end     start

根据LZ的第一种方法改的 其中利用高低位同时运算的特点 只循环四次 相应inc bx 改为 add bx,2
似乎在模拟器中可以验证成功
ailesargentees
[第11楼]   [ 回复时间:2010-03-21 17:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-01-02 17:21
还是觉得第一种方法好一点 因为可以避免使用10H 20H这样的magic number 毕竟有可能不知道相加数的个数

另外6L的错误可能是由于LZ代码中最后一句造成的 似乎应该是 int 21H 而不是int 21(貌似我自己刚才贴的代码也一起拷贝错了)

另外我用的是WINDOWS下汇编的IDE Emulator,不知道LZ用的里面十六进制的H是否要加 看回帖好像是要加以区分十进制的
zjkl19
[第12楼]   [ 回复时间:2010-03-24 12:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2009-07-15 11:17
我是这样做的,最后结果是ss:0的内存空间比楼主大了8个字节,不知道算不算答案的一种:
code segment

start: mov ax,s
           mov ds,ax
           
           mov ax,b
           mov es,ax
           
           mov ax,c
           mov ss,ax
           mov sp,16
           
           mov bx,7
           mov cx,8
           
        x: mov dx,ds:[bx]
           add dx,es:[bx]
           push dx
           dec bx
           loop x
        mov ax,4c00h
        int 21h
code ends
end start
mawentao728
[第13楼]   [ 回复时间:2010-06-03 16:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-03 14:15
楼主直接用ax操作应该是操作一个字呀,怎么会把一个个字节添加到c段中去呢?
可我测试了第一种方式却又没问题,为什么呢?
xy26333
[第14楼]   [ 回复时间:2010-06-04 01:52 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
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,0000H
mov bx,0000H
mov cx,0008H
s0:mov al,[bx]
add es:[bx],al
inc bx
loop s0
mov ax,b
mov ds,ax
mov ax,0000H
mov bx,0000H
mov cx,0008H
s1:mov al,[bx]
add es:[bx],al
inc bx
loop s1
mov ax,4c00H
int 21H
code ends
end start
xy26333
[第15楼]   [ 回复时间:2010-06-04 02:09 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
我不知道[bx+10]这种做法,(借鉴了(*^__^*) 嘻嘻……) 所以用了两个循环体,顺便说下,第一个循环体中的
add es:[bx],al  最好改为 mov es:[bx],al
sanglei
[第16楼]   [ 回复时间:2010-06-24 14:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-05-06 22:04
assume cs:code,ds:data
data segment
a        db 1,2,3,4,5,6,7,8
b         db 1,2,3,4,5,6,7,8
c        db 0,0,0,0,0,0,0,0
data ends
code segment
start:
        mov ax,data
        mov ds,ax
        mov bx,offset a
        
        mov cx,8
        mov si,0
        mov di,0
s:        
        mov ah,ds:[bx+si]
        add ah,ds:[bx+di+8]
        mov ds:[bx+di+16],ah
        inc di
        inc si
        loop s
        
        mov ax,4c00h
        int 21h        
code ends
end start
masmaster
[第17楼]   [ 回复时间:2010-06-25 12:33 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
assume cs:code,ds:data
data segment
a        db 1,2,3,4,5,6,7,8
b         db 1,2,3,4,5,6,7,8
c        db 0,0,0,0,0,0,0,0
data ends
code segment
start:
        mov ax,data
        mov ds,ax
        mov bx,offset a
        
        mov cx,8
        mov si,0
        mov di,0
s:        
        mov ah,ds:[bx+si]
        add ah,ds:[bx+di+8]
        mov ds:[bx+di+16],ah
        inc di
        inc si
        loop s
        
        mov ax,4c00h
        int 21h        
code ends
end start
------------------
回复: good job
awoofa3
[第18楼]   [ 回复时间:2010-07-05 01:07 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-23 11:33
楼上的 我怎么都看不懂呀?什么si  di 的。

楼主提供的第二种方法好厉害。我怎么想到呢!!
joneui
[第19楼]   [ 回复时间:2010-07-05 21:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-06-08 22:23
我写的程序,运行是没有问题,但是没有想到还有这么多简单的方法,学习了
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

cc segment
    db 0, 0, 0, 0, 0, 0, 0, 0
cc ends

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

           mov bx, 0
           mov cx, 8

        s: sub dx, dx

           mov ax, b
           mov es, ax
           mov dl, es:[bx]

           mov al, ds:[bx]
           add dl, al

           mov ax, cc
           mov es, ax
           mov es:[bx], dl

           inc bx


           loop s
           mov ax, 4c00h
           int 21h
code ends
end start
masmaster
[第20楼]   [ 回复时间:2010-07-05 22:28 ]   [引用]   [回复]   [ top ] 
荣誉值: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 bx,0
        mov cx,8
s:      mov al,[bx]
        add al,[bx+10h]
        mov [bx+20h],al
        inc bx
        loop s
        mov ah,4ch
        int 21
code    ends
end     start
imandry
[第21楼]   [ 回复时间:2010-07-13 14:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2010-07-13 10:33
这道题没人用堆栈?……真是……
masmaster
[第22楼]   [ 回复时间:2010-07-13 16:33 ]   [引用]   [回复]   [ top ] 
荣誉值: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   ................
-
haker007
[第23楼]   [ 回复时间:2011-09-07 17:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-10 12:45
楼主直接用ax操作应该是操作一个字呀,怎么会把一个个字节添加到c段中去呢?
可我测试了第一种方式却又没问题,为什么呢?
------------------
回复: 可能是这样的,楼主的方式虽然把c放到ss栈寄存器中,但是实际上把ss定位的空间当做普通数据段来使用,因为在c段中定义数据位 db ,所以即便 没有使用push 或 pop的操作,也只是对字节操作,每次sp移动1位,是这样吧? 
我自己改写了书上的程序想验证这个问题,但是遇到错误。。
haker007
[第24楼]   [ 回复时间:2011-09-07 17:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-10 12:45
楼主直接用ax操作应该是操作一个字呀,怎么会把一个个字节添加到c段中去呢? 
可我测试了第一种方式却又没问题,为什么呢? 
------------------ 
回复: 可能是这样的,楼主的方式虽然把c放到ss栈寄存器中,但是实际上把ss定位的空间当做普通数据段来使用,因为在c段中定义数据位 db ,所以即便 使用push 或 pop的操作,也只是对字节操作,每次sp移动1位,是这样吧?  
我自己改写了书上的程序想验证这个问题,但是遇到错误。。
chinatree
[第25楼]   [ 回复时间:2011-09-07 19:42 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
嗯,高位的被相对低位的覆盖掉了。
haker007
[第26楼]   [ 回复时间:2011-09-07 23:19 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-08-10 12:45
做这题时候似乎面对几个困惑,这也应该是通过实验掌握的

东西:
1.题目要求将a、b段中的数据相加放入c段,那么我该如何定

位a、b、c段的段地址?
题目代码声明了 
assume  cs:code 
后面的代码段都有标号 a、b、c ,但是没有显式声明如 

ds:a,es:b,ss:c 。 
我是否可以在代码中直接用 a、b、c 来代表a、b、c段的段

地址呢?
在前面的学习中,书丽大都是显式声明为 ds:a,es:b,ss:c 

这种格式 ,那便可以在代码用 a、b、c 来代表a、b、c段的

段地址。
那只有试验了。
试验发现: 直接用标号a、b、c 是可以代表段地址的。形如


mov ax,a     ;将标号a所代表的段地址赋值给ax,而不是将

0ah赋值给ax
mov ds,ax    ;将a段与ds段相关联

假若试验结果是相反的,使用标号a、b、c不能代表各段地址

,那我将如何编码?
我准备用前面几题考察中用到的,假设cs 段地址为X,那么

根据cs的地址来计算a、b、c段的偏移。

2.题中声明段数据的时候使用 db,前面学习中书上都声明为

dw,猜测这个db应该是代表define byte 吧?姑且这样认为

吧,应该没错。
题目中定义了一个c段,看那格式第一反应是把c段定义为一

个栈空间,如果按照这个思路,那么将db这种类型数据入栈

出栈是否和书中对于dw这种字单元出栈入栈时候的情况一样

呢?
自己估测应该不一样,这该是老师给我们的提问吧,是否一

样,需要你去验证。
那么我就估测,系统对于db定义的堆栈内存空间,在出入栈

的时候,应该是sp偏移1,就是入栈时候sp-1,出栈时候

sp+1.(这也就是字单元和字节单元在堆栈定义上的区别吧)。
假如关于db的栈操作想法是正确的,那么又要面临一个问题

,如果我将a、b两端数据相加后放在某寄存器(如dx)中,那

么我压栈时从栈顶处存入数据,那么放满8字节的栈空间后,

在内存里查看到的c段里存放的两两相加数据是逆序的,就是

先加的放栈内存最末端,而实际上,我们可能是要先加的结

果放前面,顺序存放相加的结果,那我该如何做?那我可能

定义[寻址器]时候,如用bx=8,然后通过每次sub bx,1,这

样就可以先将a、b段中最后的数据相加,结果压栈时候也是

放在栈底,顺序与结果对应。
23楼用堆栈方式实现蛮好,就是学到第六章位置,似乎是没

学到dec这个指令。如果不用这个指令,代码又要复杂一些吧


看到1楼用的是将c段作为普通段来使用,这的确是一个比较

容易的处理方式。

说得比较乱,当是给我自己对该题又理了此思路,同时希望大家能对我批评指正。
mywtfmp3
[第27楼]   [ 回复时间:2011-10-05 15:45 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-03 23:41
我用第一种方法,结果不对。。。
mywtfmp3
[第28楼]   [ 回复时间:2011-10-05 15:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-03 23:41
我想问一下,用您的代码的确是正确的,但是我对第一种方法有疑问
您用的是整个寄存器操作
        mov ax,[bx]
        add ax,es:[bx]
        mov ss:[bx],ax 
我的理解是:ds:[bx]里的word数据,从内存里读出来应该是0201h,mov ss:[bx],ax的话,栈中存放的就是0402h,也就是说最后的数据会变成04 02 08 06等等
我的理解有什么错误?
------------------
回复:实际上楼主并没有用堆栈操作,只是把ss当做了一个普通的段寄存器。如果结果是0402,那么内存中还是02 04
mywtfmp3
[第29楼]   [ 回复时间:2011-10-05 16:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-03 23:41
这是我的程序
——————————————————————————————————————————————————————————————————————————————————————————

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,c
        mov es,ax

        mov bx,0
        mov cx,8

  s:    mov ax,a
        mov ds,ax
        mov al,ds:[bx]
        mov es:[bx],al
        mov ax,b
        mov ds,ax
        mov al,ds:[bx]
        add es:[bx],al
        inc bx

        loop s

        mov ax,4c00h
        int 21h

code ends
end start
——————————————————————————————————————————————————————————————————————————————————
zm00
[第30楼]   [ 回复时间:2011-10-08 08:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-08 05:35
把inc bx 改成add bx,2。
你这种结果是正确的,但是是个不断覆盖的过程
zm00
[第31楼]   [ 回复时间:2011-10-08 08:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-10-08 05:35
循环次数也要改下
cheng12308
[第32楼]   [ 回复时间:2011-10-13 20:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-15 21:15
"""通过观察,a段和b段相连,"""什么a和b相连呢》?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved