|
主题 : : 【实验5】第五小题两种解法 [待解决] |
回复[ 32次 ]
点击[ 1078次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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 ........
-
- | | |
|
|
|
|
[第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 ~
$ | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-01-09 12:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51 |
通过对比, 所用代码少了8bytes O(∩_∩)O~ | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第4楼]
[ 回复时间:2010-01-20 00:16 ]
[引用]
[回复]
[ top ] | |
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51 |
|
|
|
|
|
[第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,这好像不行吧。 | | |
|
|
|
|
[第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,这好像不行吧。
------------------
回复:
可以不用关联的, 我的文件都是实验过的 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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等等
我的理解有什么错误? | | |
|
|
|
|
[第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
似乎在模拟器中可以验证成功 | | |
|
|
|
|
[第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是否要加 看回帖好像是要加以区分十进制的 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第13楼]
[ 回复时间:2010-06-03 16:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-06-03 14:15 |
楼主直接用ax操作应该是操作一个字呀,怎么会把一个个字节添加到c段中去呢?
可我测试了第一种方式却又没问题,为什么呢? | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第15楼]
[ 回复时间:2010-06-04 02:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09 |
我不知道[bx+10]这种做法,(借鉴了(*^__^*) 嘻嘻……) 所以用了两个循环体,顺便说下,第一个循环体中的
add es:[bx],al 最好改为 mov es:[bx],al | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第18楼]
[ 回复时间:2010-07-05 01:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2010-06-23 11:33 |
楼上的 我怎么都看不懂呀?什么si di 的。
楼主提供的第二种方法好厉害。我怎么想到呢!! | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第21楼]
[ 回复时间:2010-07-13 14:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2010-07-13 10:33 |
|
|
|
|
|
[第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 ................
- | | |
|
|
|
|
[第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位,是这样吧?
我自己改写了书上的程序想验证这个问题,但是遇到错误。。 | | |
|
|
|
|
[第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位,是这样吧?
我自己改写了书上的程序想验证这个问题,但是遇到错误。。 | | |
|
|
|
|
[第25楼]
[ 回复时间:2011-09-07 19:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59 |
|
|
|
|
|
[第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段作为普通段来使用,这的确是一个比较
容易的处理方式。
说得比较乱,当是给我自己对该题又理了此思路,同时希望大家能对我批评指正。 | | |
|
|
|
|
[第27楼]
[ 回复时间:2011-10-05 15:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-03 23:41 |
|
|
|
|
|
[第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 | | |
|
|
|
|
[第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
—————————————————————————————————————————————————————————————————————————————————— | | |
|
|
|
|
[第30楼]
[ 回复时间:2011-10-08 08:32 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-08 05:35 |
把inc bx 改成add bx,2。
你这种结果是正确的,但是是个不断覆盖的过程 | | |
|
|
|
|
[第31楼]
[ 回复时间:2011-10-08 08:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-08 05:35 |
|
|
|
|
|
[第32楼]
[ 回复时间:2011-10-13 20:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-04-15 21:15 |
"""通过观察,a段和b段相连,"""什么a和b相连呢》? | | |
|