段内转移: 格式:call 标号 原理: 1)将当前的 IP 压入栈中 (sp) = (sp) – 2 ((ss)*16+(sp)) = (IP) 2)转移到标号处执行指令 call指令实现转移的方法和 jmp 指令的原理相似 (IP) = (IP) + 16位位移 相当于 jmp near ptr 标号 段间转移: 格式:call far ptr 标号 原理: 1)将当前的CS和 IP 压入栈中 (sp) = (sp) – 2 ((ss) ×16+(sp)) = (CS) (sp) = (sp) – 2 ((ss) ×16+(sp)) = (IP) 2)转移到标号处执行指令 (CS) = 标号所在的段地址 (IP) = 标号所在的偏移地址 相当于 jmp far ptr 标号 转移地址在寄存器中: 格式:call 16位寄存器 相当于: push IP jmp 16位寄存器 转移地址在内存中: 1. call word ptr 内存单元地址 相当于: push IP jmp word ptr 内存单元地址 2. call dword ptr 内存单元地址 相当于: push CS push IP jmp dword ptr 内存单元地址(低地址放偏移地址,高地址放段地址)
ret指令 功能:用栈中的数据,修改IP的内容,从而实现近转移段内返回,相当于pop IP retf指令 功能:用栈中的数据,修改CS和IP的内容,从而实现远转移段间返回,相当于pop IP,popCS
题目要求:编制一个子程序,求y=x^4,并将结果存入在相应的数据区 data segment
x db 1,2,3,4,5,6,7,8 y dw 0,0,0,0,0,0,0,0data ends
assume cs:codesg, ds:datasg,ss:stacksg datasg segment x db 1,2,3,4,5,6,7,8 y dw 0,0,0,0,0,0,0,0 datasg ends stacksg segment db 32 dup (0) stacksg ends codesg segment main proc start: mov ax,datasg mov ds,ax mov ax,stacksg mov ss,ax mov sp,16 mov cx,8 lea si,x ;取得x的标号,作为源偏移地址 lea di,y ;取得y的标号,作为目标偏移地址 op:mov bl,[si] ;为调用子程序准备参数 call subp ;子程序调用返回后要做的处理 mov [di],ax ;存入相应单元 inc si inc di inc di loop op mov ax,4c00h int 21h main endp ;子程序功能:求y=x^4 ;入口参数:x的值由bl提供 ;返回值:y值由ax返回,且y值不会超过1个字的范围 subp proc push bx mov cx,4 mov bh,0 mov ax,1 l:mul bx loop l pop bx ret subp endp codesg ends end start多文件存储调用 p1.asm文件中
extrn subp:far assume cs:codesg, ds:datasg,ss:stacksg datasg segment x db 1,2,3,4,5,6,7,8 y dw 0,0,0,0,0,0,0,0 datasg ends stacksg segment db 32 dup (0) stacksg ends codesg segment main proc start: mov ax,datasg mov ds,ax mov ax,stacksg mov ss,ax mov sp,16 mov cx,8 lea si,x ;取得x的标号,作为源偏移地址 lea di,y ;取得y的标号,作为目标偏移地址 op:mov bl,[si] ;为调用子程序准备参数 call subp ;子程序调用返回后要做的处理 mov [di],ax ;存入相应单元 inc si inc di inc di loop op mov ax,4c00h int 21h main endp codesg ends end startp2.asm文件中:
public subp assume cs:codesg codesg segment subp proc push bx mov cx,4 mov bh,0 mov ax,1 l:mul bx loop l pop bx retf subp endp codesg ends end注意这里的编译链接过程: 分开编译: masm p1.asm;生成p1.obj masm p2.asm;生成p2.obj 一起连接: link p1.obj+p2.obj 连接过程中会提示生成的exe文件名称 debug xx.exe
格式:mul 寄存器或mul 内存单元