title: 汇编笔记_第十章
date: 2018-12-28 18:18:50
pop IP
,pop IP
pop CS
CPU执行call指令,进行两步操作:
call指令 不能实现短转移,除此之外与jmp的原理相同;
指令格式:
call 标号
将当前的IP压栈后,转到标号处执行;(入栈的是call指令后的第一个字节偏移地址入栈),段内转移;
相当于:
push IP
jmp near ptr 标号
eg:
内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0
1000:3 e8 01 00 call s
1000:6 40 inc ax
1000:7 58 s:pop ax
最后ax的值为:6h,因为执行call s时,push ip (ip)=6h,之后pop ax,(ax)=6h
call far ptr 标号
实现的是段间转移;((ss)*16+(sp))=(ip)
(ip)=标号所在的偏移地址;
eg:
内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0
1000:3 9A 09 00 00 10 call far ptr s
1000:8 40 inc ax
1000:9 58 s:pop ax
add ax,ax
pop bx
add ax,bx
指令执行后,(ax)=1010h
执行call时,push cs , push ip,(cs)=1000h,(ip)=8h;
pop ax后,(ax)=8h,add ax,ax后(ax)=10h,pop bx后(bx)=1000h,最后add ax,bx,(ax)=1010h;
格式:
call 16位寄存器
功能:
相当于进行:
push ip
jmp 16位reg
eg:
内存地址 机器码 汇编指令
1000:0 b8 06 00 mov ax,6
1000:3 ff d0 call ax
1000:5 40 inc ax
1000:6 mov bp,sp
add ax,[bp]
程序执行完后,(ax)=0bh;
两种格式:
call word ptr 内存单元地址
相当于:
push ip
jmp word ptr 内存单元地址
call dword ptr 内存单元地址
相当于:
push cs
push ip
jmp dword ptr 内存单元地址
eg:
assume cs:code
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov ax,atack
mov ss,ax
mov sp,16
mov ds,ax
mov ax,0
call word ptr ds:[0EH]
inc cx ;设这个地方的地址为0000:xx
inc cx
inc cx
mov ax,4c00h
int 21h
code ends
end start
程序执行到call前,堆栈段和数据段合并,执行call时(ip)=x,入栈,也是数据段ds:[0EH]处的数据为x,这是跳到x处的指令也就是inc ax
,,三次inc后(ax)=3h;
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
cpu执行的主要过程:
call s
指令时,ip指向后一句mov bx,ax
处,并将其压栈,之后修改ip到s处,实现程序的跳转;mov bx,ax
处,最后结束;子程序的框架;
标号:
指令
ret
格式:
子程序名 PROC 属性
......
子程序名 ENDP
code segment
main proc far
...
call subr1
...
subr1 proc near
...
ret
subr1 endp
main endp
code ends
或
code segment
main prco far
...
call sunr1
...
main endp
subr1 proc near
...
ret
subr1 endr
code ends
code1 segment
main proc far
...
call subrx
...
mov ah,4ch
int 21h
main endp
code1 ends
code2 segment
...
call subrx
...
subrx proc far
...
ret
subrx endp
code2 ends
主程序调用子程序时可能寄存器的值会被改变,需要保存此时的值后再进入子程序,一般的实现是利用栈来保存可能改变的寄存器的值,退出子程序时pop恢复现场;
mul reg
mul 内存单元
不同位的相乘:
内存单元可用不同的寻址方式给出:
mul byte ptr ds:[0]
(ax)=(al)*((ds)*16+0)
mul word ptr [bx+si+8]
含义:(ax)=(al)*((ds)*16+(bx)+(si)+8)
(dx)=(al)*((ds)*16+(bx)+(si)+8)
结果大于255就用16位的
xchg oprd1,oprd2
xchg reg,reg
xchg reg,mem
xchg mem,reg
xchg 指令不允许的情况:
https://www.cnblogs.com/31415926535x/p/10197667.html
(end)
原文:https://www.cnblogs.com/31415926535x/p/10197667.html