检测点10.5
看图应该是没有循环 因为call 是先将后一条指令的偏移入栈 所以0eh 处就是call后一条指令的偏移
也就是说call word ptr ds: call的就是inc ax这条指令。
本人也正在学 王爽的 汇编语言。不知道回答的对不对,希望对你有帮助。
在这里call命令第一次0eh是零但是把它后面一条指令的偏移进栈了 也就是 inc ax这条指令的偏移放到了0eh, 所以循环到第二次call的也就是这条指令。 call 先把 inc ax 偏移地址压栈
然后 跳转到ds:执行一句,经过上句的压栈,ds:已是inc ax的偏移地址了,所以会执行一句inc ax,再返回Call的下一句执行。
整个过程,inc ax执行的次数,比代码中书写的inc ax数,多一次。 来看看,学习了 都是高手啊! 谁有时间解释下! 不是很懂, 这段代码,SS段和DS段是同一个段, call word ptr ds:执行时,将inc ax这段代码的ip压入栈中,这时(sp)=(sp)-2,执行后,jmp word ptr ds:,ds:=((ss)*16+(sp))=ss:,所以跳到inc ax继续执行。 厉害啊!!!! 能不能解释下图的意思 只是把CALL后一句的IP压入栈 我被这个困惑了好久 {:10_256:}{:10_256:}四楼说的不错 不过答案没有多一次,只是将call后面inc ax的IP压入栈中,然后jmp过去跳到栈中找要跳的地址,还是那个call后面Inc ax的IP,又回来了 12123 assume cs:code
stack segment ;定义栈段
dw 8 dup (0) ;16个字节
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,16 ;栈初始化
mov ds,ax ;数据段和栈段是同一段空间
mov ax,0 ;ax=0
call word ptr ds:;把下一条指令的cs和ip压入栈空间sp=0eh cs入栈 然后ip入栈
;call后把cs 和ip还原 等同于call到下一条指令执行
inc ax ;ax=1
inc ax ;ax=2
inc ax ;ax=3
mov ax,4c00h
int21h ;程序正常结束ax的值为3
页:
[1]