《零基础入门学习汇编语言》第四十九讲续(含检测点10.5与问题10.1)
本帖最后由 shuiyu 于 2017-12-12 17:25 编辑越努力,越幸运。欢迎大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指正,谢谢{:10_254:}
一、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:
inc ax
inc ax
inc ax
mov ax,4c00h
int 21h
code ends
end start
解:ax=3由题目可知当执行到call时,先执行push IP 然后执行jmp word ptr ds: ;当执行push ip 时,ip=11h,sp=sp-2=ds:,因为ss=ds,故ds:=11h,所以执行jmp跳转到ip=11h内存单元,内存单元是第一个inc ax处,三次加1后,ax=3
至于为什么不能用debug:
根据单步跟踪发现,执行call word ptr ds:指令时,显示ds:=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:,offset s ;(ss:)=1ah
mov ss:,cs ;(ss:)=cs
call dword ptr ss: ;cs入栈,ip=19h入栈,转到cs:1ah处执行指令,也就是标号s处。
nop
s:mov ax,offset s ;ax=1ah
sub ax,ss: ;ax=1ah-(ss:)=1ah-19h=1
mov bx,cs ;bx=cs
sub bx,ss: ;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:释义:首先cs入栈,然后ip=19h入栈(IP=19h是因为ip指向本条指令的下一条指令处),最后jmp到刚刚入栈的的CS:IP处,即jmp到cs:19h处执行命令。
3.后面的是一些简单计算,说一说难理解的:ss:这个栈里放的是CS,ss:里放的是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处执行命令了,程序结束。
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指教,谢谢{:10_254:} call s.cs 不需要入栈,ip入栈.然后再跳转 weiiew 发表于 2017-12-11 21:40
call s.cs 不需要入栈,ip入栈.然后再跳转
谢谢指正{:5_106:}已经改正过来了,谢谢 需要补充的是nop指令占用一个字节,取指令call dword ptr ss: 会使得ip指向nop,而执行call dword ptr ss: 指令会使得ip指向s,中间正好差了一个nop指令(1个字节),所以ax=1 题主做题的时候是怎么获取到IP值的?。。。。根据经验计算汇编指令的长度? mov ax,stack怎么理解 打卡
页:
[1]