|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 shuiyu 于 2017-12-12 17:25 编辑
越努力,越幸运。欢迎大家来看我的笔记 小白刚学,不对的请各位大佬指正,谢谢
一、call word ptr 内存单元地址
汇编语法解释:
push IP
jmp word ptr 内存单元地址
二、call dword ptr 内存单元地址
汇编语法解释:
push CS
push IP
jmp dword ptr 内存单元地址
检测点10.5
(1)下面的程序执行后,ax中的数值为多少?(不能用debug)
assume cs:code
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ds,ax
mov ax,0
call word ptr ds:[0eh]
inc ax
inc ax
inc ax
mov ax,4c00h
int 21h
code ends
end start
解:ax=3由题目可知当执行到call时,先执行push IP 然后执行jmp word ptr ds:[0eh] ;当执行push ip 时,ip=11h,sp=sp-2=ds:[0eh],因为ss=ds,故ds:[0eh]=11h,所以执行jmp跳转到ip=11h内存单元,[11h]内存单元是第一个inc ax处,三次加1后,ax=3
至于为什么不能用debug:
根据单步跟踪发现,执行call word ptr ds:[0eh]指令时,显示ds:[0eh]=0543。ds:0000~ds:0010不是已设置成stack数据段了嘛,不是应该全都是0的嘛。于是进行了更详细的单步跟踪,发现初始数据段中数据确实为0,但执行完mov ss,ax;mov sp,16这两条指令后,数据段中数据发生改变。这是为什么呢?应该就是中断惹的祸了~~~
(2)下面的程序执行后,ax和bx中的数值为多少?
assume cs:codesg
stack segment
dw 8 dup(0)
stack ends
codesg segment
start:
mov ax,stack
mov ss,ax
mov sp,10h
mov word ptr ss:[0],offset s ;(ss:[0])=1ah
mov ss:[2],cs ;(ss:[2])=cs
call dword ptr ss:[0] ;cs入栈,ip=19h入栈,转到cs:1ah处执行指令,也就是标号s处。
nop
s: mov ax,offset s ;ax=1ah
sub ax,ss:[0ch] ;ax=1ah-(ss:[0ch])=1ah-19h=1
mov bx,cs ;bx=cs
sub bx,ss:[0eh] ;bx=cs-cs=0
mov ax,4c00h
int 21h
codesg ends
end start
解:ax=1 bx=0
1.offset s是取标号s处的ip。
2.call dword ptr ss:[0]释义:首先cs入栈,然后ip=19h入栈(IP=19h是因为ip指向本条指令的下一条指令处),最后jmp到刚刚入栈的的CS:IP处,即jmp到cs:19h处执行命令。
3.后面的是一些简单计算,说一说难理解的:ss:[0eh]这个栈里放的是CS,ss:[0ch]里放的是IP=19H(因为前面是CS先入栈IP后入的栈)。
问题10.1
程序返回前,bx中的值是多少?
assume cs:code
code segment
start:mov ax,1
mov cx,3
call s
mov bx,ax
mov ax,4c00h
int 21h
s: add ax,ax
loop s
ret
code ends
end start
解:bx=8
PS:执行ret指令时,相当于进行:pop IP
执行call s指令时,相当于进行:执行指令 “call 标号” ,相当于进行:
push IP
jmp near ptr 标号
分析call s和ret的过程:
执行到call s 处时跳转到标号s处执行命令。(ip入栈,ip指向下一条指令即mov bx,ax处入栈),执行完S标号处的命令后,loos s 循环3次(因为cx=3)。当第四次执行loop s时,cx=0不再循环,故往下执行ret(POP IP)。因为前面有IP入栈了.....所有IP指向mov bx,ax处执行命令了,程序结束。
谢谢小甲鱼带来的视频教程,感谢!!
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记 小白刚学,不对的请各位大佬指教,谢谢 |
评分
-
查看全部评分
|