faly 发表于 2013-6-10 01:03:21

王爽的课后题不解

有两个问题,是王爽第十章的题,希望大家帮忙解答,
嘻嘻{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}
问题一:下面括号中指令的作用 ,我感觉只改变一下bx的值为0,没有其他作用了,对吗

assume cs:code

stack segment
        db 16 dup (0)
stack ends

code segment
                mov ax,4c00h
                int 21h

start:        mov ax,stack
                mov ss,ax
                mov sp,16
                mov ax,0
                push ax
             《mov bx,0》
                ret
code ends
end start



问题二:
题目是:下面程序执行后,ax的值为多少?
我的问题是下面括号中《add ax,bx》中的bx值不确定,所以每个人最后的ax值都不一样,我想的对吗?
   mov ax,0
   call far ptr s
   inc ax
s: pop ax
   add ax,ax
   pop bx
   add ax,bx

850192964 发表于 2013-6-10 01:03:22

第一个问题:还是有作用的,这个程序只是为了让你更加深刻的了解ret指令的原理,因为你把大小为一个字的数据0压入了栈中,执行ret指令后,IP的值改变了,IP的值变为了0,现在程序就跳转到了第一条指令(mov ax,4c00h)了
第二个问题:ax的值为1010h,注意这是个十六进制数,根据你这个帖子是看不出来bx是什么值的,你看看书上左边有对应的内存地址和机器码,这个还是为了让你加深call指令的使用,调用call指令时,CS和IP都入栈,所以执行s标号后的(pop ax)指令后,ax值为0008h,就是之前压入栈中IP的值,之后(add ax,ax),ax变为0010h,再来(pop bx),bx变为1000h,这是之前压入栈中CS的值,(add ax,bx)你懂得

az4121 发表于 2013-6-11 07:13:54

关注点在ret和call上

unicornxiaodong 发表于 2013-6-12 09:54:34

第一问
单看一段代码可以省略。一个程序片段中,主要是为了进行中断现场的维护,防止传值到主程序中去所以调用的程序片段结束后往往要清理寄存器,而mov bx,0的做用就是清理bx寄存器的.这显然只是一些程序员的习惯
第二问
你发的这段代码片段不完整吧??
POP在栈里弹出,你没给出push的代码或者是SS:SP的数据

Nedong 发表于 2013-6-13 21:42:41

你的理解和我的理解一样。问题一:push ax后,栈顶元素为0,之后ret,IP值变为0,程序跳到mov ax, 4c00h,所以中间的mov bx, 0对程序的跳转是没有作用的
问题二,call far ptr s,执行的程序相当于push ip, push cs(当然程序指令是不会这样执行的,只是为了便于说明),这样,后面的程序执行后,ax = ip, bx = cs, cs的值与个人计算机有关,不是一个定值。

古来圣贤皆寂寞 发表于 2013-7-24 19:55:53

楼主ing……
页: [1]
查看完整版本: 王爽的课后题不解