|
主题 : : p306页中的[SI]有什么作用? [待解决] |
回复[ 8次 ]
点击[ 456次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-12-23 16:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38 |
第17章关于字符串输入的程序中有如下代码:
...
charpush: mov bx,top ;top是标号,其值相当于标号处的偏移地址,这里为什么将这个偏移地址赋给bx?
mov [si][bx],al ;[si]似乎可有可无,我运行程序时去掉[si]后的效果与有它是相同的...
;另外这里寻址时默认的段寄存器是ds还是cs,书本288页的例子是cs,
;但如果在开头定义了数据段data,则需要在assume中将标号与某寄存器
;(如ds)联系,并输入mov ax,data和mov ds,ax,以访问data段,此时的
;默认段寄存器是ds,不知道我的分析对否...
inc top ;此处是将top处的内存单元中数据的值加1,为什么要有这句代码?
jmp sret
...
其它子程序中也有类似的问题...
这是我学习中遇到问题最多的一节,期盼解答,感激不尽... | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-12-23 16:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38 |
top标号所在的段在代码段,书本289页的例子中,标号与assuem中关联的段相同,为data段,这与这一节中的例子也是不同的,所以要确定mov [si][bx],al默认的段地址也要看assume中是如何关联的,start时又是如何设置的... | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-12-23 23:35 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
mov [si][bx],al这条指令默认的段地址当然是ds,是否关联是跟标号有关系的,如果与ds关联,相关段中标号的段地址会从ds中去取,如果跟es关联,相关段中的标号的段地址会从es中去取。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-12-24 09:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38 |
现在大部分问题已经弄懂了,还有一个情况是,我在实验时发现[si]和charpop子程序中的如下代码:
mov bx,top
mov al,[si][bx]
对程序的运行结果好像没有什么影响...因为我动手实践过了... | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-12-24 13:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第5楼]
[ 回复时间:2011-12-24 13:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第6楼]
[ 回复时间:2011-12-24 15:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38 |
是出栈操作,但这2条指令前已经有dec top,实际上相当于栈顶减一个字节,所以后面再调用charshow子程序时并不影响显示字符串,将栈顶中的数据放到al中没有意义。 | | |
|
|
|
|
[第7楼]
[ 回复时间:2011-12-29 23:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第8楼]
[ 回复时间:2012-10-16 19:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-03-20 21:27 |
|