当前位置:编程学习 > 汇编语言 >>

请看下下面的汇编程序,求教大侠

data1 segment vary1 dw 1234h vary2 dd vary3 data1 ends data2 segment vary3 dw -5 vary4 dw 12 data2 ends code segment 'code' assume cs:code,ds:data1 start:mov ax,data1 mov ds,ax mov dx,vary1 lds si,vary2 mov bx,[si] mov cx,2[si] mov ah,4ch int 21h code ends end start 可以解释下ax,bx,cx,dx,si,di,ds是怎样被赋值的,为什么这样?
答案:首先,不知道这题是谁出的,想的真的非常的周全。
1, 先来看数据被转换后的内存分布情况:
data1 segment                ;data1段(注意,在这我设从这里开始的段起始地址为X,下同)
			vary1 dw 1234h            ;内存分布34 12
			vary2 dd vary3             ;取vary3的地址并以dd扩展,内存分布00 00 X+1
data1 ends
data2 segment              ;data2段
			vary3 dw -5                 ;内存分布FB FF
			vary4 dw 12                ;内存分布0C 00
data2 ends
难点:1,一个段的最小大小,2,以另一个标签来定义数据
首先,这是16位程序,一个段的最小大小为16bytes,在定义vary2时,取vary3的地址作为数据,比如data1的地址为0C00开始,那么data2的段地址为0C01(即vary3的地址),不小看这1, 别忘了地址的计算是段地址X16+偏移(32位计算方法不同),1可是16字节。后面的vary3和vary4定义就不解释了,常规定义(只是注意vary3是补码,值为FFFB)
那么再看这几个数据在内存中的分布:
                                                                                 |到这data1段结束,段data2开始
34 12 00 00 01 0C 00 00-00 00 00 00 00 00 00 00 FB FF 0C 00 00 00 00 00-00 00 00 00 00 00 00 00

把这个了解之后,后面的代码就相当简单了(我们还是设data1起始为0c00:
mov ax,data1                          ax=0c00
mov ds,ax                               ds=0c00
mov dx,vary1                          dx=1234
lds si,vary2                             si=0000 并且ds=0c01(上面解释过)LDS命令为取word ptr X后,将word ptr X+2赋给DS
mov bx,[si]                              bx=0c01:0000=FFFB
mov cx,2[si]                            cx=0c01:0000+2=C
mov ah,4ch
int 21h

你帖的图明显不是上面程序执行完成后的图。因为你图里的结果和上面程序的完全对应不上。
另外在你帖的程序里面并没有关于CS,DI,ES,SS,BP的操作。
对照上面的解释并对应你自己程序内的data1段偏移,再调试一次吧。

上一个:51单片机汇编程序开始是什么
下一个:单片机汇编中出现错误ILLEGAL CHATACTER 是什么意思?

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,