|
主题 : : 【实验5】第五小题两种解法 [待解决] |
回复[ 32次 ]
点击[ 1082次 ] | |
|
|
|
|
[帖 主] [ 发表时间: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 ........
-
- | | |
|
|
|
|
[第26楼] [ 回复时间:2011-09-07 23:19 ] | |
荣誉值: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段作为普通段来使用,这的确是一个比较
容易的处理方式。
说得比较乱,当是给我自己对该题又理了此思路,同时希望大家能对我批评指正。 | | |
|