|
主题 : : 13.3有个问题不理解 [待解决] |
回复[ 13次 ]
点击[ 503次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-08-17 23:39 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-07-24 16:39 |
257页就是
add [bp+2],bx
不是
sub [bp+2].bx
程序不是一条条向下执行,Ip就减去上一条指令的字节
如:
s: 假如5个字节指令,IP=0
se: 2个字节指令 IP=5
那么
s偏移地址=se-5
为什么书中是加bx,和书中2.10节内容冲突。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-08-17 23:46 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:1
注册日期:2011-06-04 00:01 |
栈往下的是高地址,IP进栈后,BP也进栈了,SP就指向BP栈顶地址了,要得到IP必须加2使指针指向栈中IP的位置
不知道这样解释你明白没有,最好画进栈的图就知道了 | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-08-17 23:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58 |
bx=offset s-offset se
乃一负数,故add | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-08-17 23:54 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-07-24 16:39 |
我明白,要使用ss:[BP+2]是se的IP地址
但是为什么是加bx,不是减去吗? | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-08-17 23:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-07-24 16:39 |
回复:[第2楼]
------------------
额,为什么是负数的? | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-08-17 23:58 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58 |
bx=offset s-offset se
[BP+2]=offset se
上下两式相加,得到offset s,不就跳转到s语句了嘛 | | |
|
|
|
|
[第6楼]
[ 回复时间:2011-08-17 23:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:1
注册日期:2011-06-04 00:01 |
因为S标号处的偏移地址比SE处的偏移地址小啊 S 标号在前 SE标号在后 | | |
|
|
|
|
[第7楼]
[ 回复时间:2011-08-18 00:00 ]
[引用]
[回复]
[ top ] | |
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58 |
s在se前,所以offset s<offset se | | |
|
|
|
|
[第8楼]
[ 回复时间:2011-08-18 00:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-07-24 16:39 |
哦,谢谢了,明白了,
我看错了
看成:mov bx,offset se - offset s
了,哎,真是粗心大意,看书不认真啊
非常感谢大家
嘿嘿,差不多学2个月了,有空就看,每天看几节。
好快看完了,后面的感觉快点了,准备学32位咯 | | |
|
|
|
|
[第9楼]
[ 回复时间:2011-10-08 16:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-10-03 16:25 |
别看太快,看的越快,你越不能理解!后面的那些内容都是跟硬件打交道的,最好认真理解,而且去上机调试一下!不然很难理解透的,我就是,以为自己基础够牢,结果被逼无奈,又重新研究了好几个星期!T_T | | |
|
|
|
|
[第10楼]
[ 回复时间:2011-10-12 11:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-03-29 22:13 |
实验十三第三道题是不能编译的题目,难道是理论性的题目? | | |
|
|
|
|
[第11楼]
[ 回复时间:2012-08-23 13:34 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-08-14 12:33 |
貌似明白了,前面的是安装程序是把offset得出的数字用到cx,现在是调用程序中出现了offset,使用bx,得出的是用s的地址减去se的地址,因为s的地址比se的要大,所以得出负数。在中断程序中要做到返回就要做逆向运算。就像a-b=c,这是在调用程序里,在中断程序中变成了c+b=a,而且由于是栈的关系,执行int时候执行了:pushf,push cs,push ip.这时的cs是s标号的段地址,ip是se的偏移地址,se和s的段地址一样的,可以说cs是s和se的段地址。中断程序中push bp,就压到了ip也就是se的偏移地址上面,现在要返回到s的偏移地址出就要,bp+2指到ip也就是se处,[bp+2]=se的偏移地址,这样加上前面mov bx,offset s-offset se得出的负数,[bp+2]+bx=s的偏移地址。完成了Loop的功能。
呼呼,不知理解的对不对啊 | | |
|
|
|
|
[第12楼]
[ 回复时间:2012-08-24 07:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36 |
|
|
|
|
|
[第13楼]
[ 回复时间:2017-07-27 16:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2017-07-20 09:18 |
为什么是加bx而不是减bx
我认为你太纠结具体的数是正还是负
试想相对的偏移量是可以向后也可以向前移动啊,那么意味着这个偏移的值是正值或者是负值。
移动的量是负数,那么相加之后就往前跳转了
移动的量是正数,那么相加之后就往后跳转了
很简单的道理哦 | | |