汇编语言汇编语言与高级语言接口共65页文档
- 格式:ppt
- 大小:5.37 MB
- 文档页数:65
第12章汇编语言与高级语言的连接12.1 BASIC程序对汇编语言子程序的调用12.2 C语言和汇编语言的相互调用12.3 FORTRAN和PASCAL等对汇编的调用12.1 BASIC程序对汇编语言子程序的调用PC机各种版本的BASIC语言对汇编语言子程序的调用方法是相同的。
它们都有实现调用的语句和函数,即CALL语句和USR函数。
12.1.1CALL语句这个语句的功能是调用一个机器语言子程序。
格式为:CALLnumvar[(Variable[,Variable]···)]其中numvar是数字变量的名字,这个变量值指明被调用的汇编语言子程序在内存中的入口地址的偏移量,而入口地址的段地址则由语句DEFSEG进行定义。
Variable是变量的名字,它是由BASIC语言传送给汇编语言子程序的参数。
例如:250DEF SEG=&H5000260LET X=0270CALLX(A,B$,C)其中250行的DEFSEG语句把子程序装入的段地址设置为5000H;260行中的LET语句,将子程序装入当前段的偏移量赋给X,此处偏移量为o。
因此,这个被调用的机器语言:子程序,是从绝对地址50000H单元开始执行的。
变量A,B$,C作为传送给这个汇编语言子程序的参数。
这个参数是BASIC语言通过堆栈向汇编语言传送的。
BASIC语言要调用汇编语言子程序,要做两件事,首先给汇编语言确定在内存中的装入地址的段地址值和段内偏移量值。
此外还要向汇编语言子程序通过堆栈传送参数。
利用CALL指令调用汇编语言子程序,有两种方法。
1.以数据形式装入汇编语言子程序以BASIC语言的数据形式装入汇编语言子程序的机器代码,它是通过READ和DA-TA语句装入的,然后再使用CALL语句实现调用。
例12.1把指令代码作为BACIC数据读入的程序:10DEFINT A~Z20DEFSEG=&H170030FOR I=0TO2140READ J50POKE I,J60NEXT70SUBRT=080A=2:B=3:C=090CALL SUBRT(A,B,C)100PRINT C110END120DATA&H55,&H8B,SLHEC,81H8B,&H76 130DATA&HOA,SLH8B,&H04,&H8B,&H76 140DATA&H08,&H03,SIH04,&H8B,&H7E 150DATA&H06,&H89,&H05,&HSD,&HCA 160DATA SLH06,SLH00OKRUN5OK从120行至160行提供了一个完成两个数相加的子程序,从这个例子中,可以看出这种调用方式的步骤有四点:①逐条地把要调用的汇编语言子程序的指令代码,以十六进制数的形式表示。
13.3汇编语言和高级语言程序的连接由于使用高级语言编写及调试程序比汇编语言的开发效率高,可移植性好,所以,高级语言比汇编语言使用更广泛。
但是在要求实时性高、占用空间少或要求直接控制硬件的场合,仍然要用到汇编语言,实现对硬件直接控制和更快的控制速度。
但汇编语言编程复杂、表达能力也差,因此比较好的解决办法是C语言与汇编语言混合编程。
目前主要的C语言程序开发环境有:Turbo C/C++、Borland C/C++,Visual C++等,都支持与汇编语言的混合编程。
C语言与汇编语言的混合编程方法一般有两种方法可以实现,即在C语言中嵌入汇编语言,也称嵌入式编程和用C语言调用汇编语言模块,即多模块混合编程。
1.汇编语言的嵌入式编程1.内嵌汇编语句格式在Turbo C中,C程序中嵌入的汇编语句前必须以关键字ASM开头,其格式为:ASM <操作码> <操作数> <;或回车换行> /*注释*/ 其中ASM为关键字,操作码可以是处理器指令也可以是伪指令,操作数是操作码可以接受的数据,可以是指令允许的立即数,寄存器名,也可以是C程序中的常量、变量和标号。
C程序中嵌入汇编代码后可以有分号也可无分号,如果汇编代码后无分号则必须以换行符结束(嵌入的汇编语句是C语言中唯一可以换行结束的语句),如果汇编代码后有分号,则一行中可以有多条嵌入的汇编语句,但一条汇编指令不能跨越两行。
特别要注意的是,嵌入的汇编语句的注释方式须采用C语言的注释方式,即必须用/*……*/来标记注释。
而不能像纯汇编那样用(;)作为一条注释的开始。
如:ASM MOV AX,DX;/*单个语句*/ASM PUSH AX;ASM POP AX;ASM MOV BX, AX;/*多个语句写在一行*/如果在C语言程序中要嵌入多个ASM语句,可以将它们放在花括号内。
如:ASM{MOV AX,DXPUSH AX}/*注释*/在C程序中,函数内部的汇编语句都是一条可执行的语句,它被编进程序的代码段,在函数外部的汇编语句是一个外部说明,在编译时放在程序的数据段中。
《汇编语言》第一章预备知识一、教学基本内容1、了解机器语言、汇编语言、汇编源程序、汇编程序、汇编、宏汇编程序等基本概念,正确认识学习汇编语言的重要性。
2、掌握8086处理器中各寄存器的符号表示形式、大小及主要用途。
3、理解主存的编址方式以及存储器物理地址形成的方式。
4、理解8086处理器关于使用堆栈的有关规定,掌握堆栈操作指令的功能以及使用格式。
5、掌握数值数据及字符数据在机内的表示形式、压缩BCD码和非压缩BCD码在机内的表示形式。
6、掌握标志寄存器中各标志位的置位方式。
重点:主存的编址方式以及存储器物理地址形成的方式难点:堆栈的概念及使用。
二、知识点:1、机器语言、汇编语言、汇编源程序、汇编程序、汇编、宏汇编程序等基本概念,要求达到“识记”层次。
2、8086处理器中各寄存器的符号表示形式、大小及主要用途,要求达到“识记”层次。
3、主存的编址方式以及存储器物理地址形成的方式,要求达到“理解”层次。
4、堆栈的概念及堆栈操作指令执行后内存及相关寄存器值的变化,要求达到“理解”层次。
5、数值数据及字符数据在机内的表示形式、压缩BCD码和非压缩BCD码在机内的表示形式,要求达到“理解”层次。
6、标志寄存器中各标志位的置位方式,要求达到“识记”层次;运算对各标志位的影响,要求达到“掌握”层次。
1.1机器语言和汇编语言1、机器语言●三种语言的层次关系机器语言汇编语言高级语言●机器指令:指挥计算机完成某一基本操作的命令。
格式:操作码地址码1 地址码2例:将偏移地址为100的字存储单元中的内容加2,在回送到原存储单元中去的机器指令如下:8306640002其中8306H为操作码6400H 为 目的操作数 02H 为源操作数 ● 指令系统:机器指令面向机器,每台计算机都规定了自己所特有的一定数量的基本指令,这批指令的全体即为该计算机的指令系统 ● 机器语言:这种 机器指令的集合。
● 机器语言程序:用机器语言编写的程序。
汇编与高级语言1.汇编基础知识1.1.寄存器说明:●ESP和EBP对高级语言的函数实现起着非常重要的作用。
●FS是SEH(Structured Exception Handling)中起重要作用的一个段寄存器,它的0偏移指向异常结构连表的表头,Windows在进行结构化异常处理时,就是从FS:[0]开始遍历异常结构并调用其中的异常处理函数的。
1.2.堆栈堆是一块内存区域,一般用于内存的动态分配和释放,比如用New方法分配一个指针,此时即在程序地址空间的堆中分配了一块内存。
又比如Delphi的对象也是在堆中创建的。
栈是一种先进后出的列表数据结构,在高级语言的编程中使用广泛,在低级语言中更是不可或缺的基础概念。
栈也是一个内存区域,不过它具有快速灵活的特点,CPU直接提供指令去访问栈。
从汇编的角度来看,栈具有如下的性质:●栈有两个基础动作,压栈(PUSH)和出栈(POP)。
●栈是向下增长的,即每压一次栈,栈顶的地址就减少一次,也可以说ESP的值就减小一次。
●栈是线程相关的,每一个线程都拥有一个栈。
●程序利用ESP可以很灵活地访问栈,不一定要执行PUSH和POP栈顶才会改变,直接操作ESP也可以改变栈顶,也就是说ESP决定了栈顶的值。
●栈是有最大值的,通过编程环境可以设置,超出最大值就会发生栈溢出。
看一个简单的例子,下面的指令是一条压栈指令,意思是将EAX的值压入栈中:PUSH EAX根据上面的性质,这条指令等价于下面的指令:SUB ESP, 4MOV ESP, EAX用下面的图表示指令的操作过程:2.调用规则2.1.从汇编的角度看函数调用汇编语言没有变量的概念,因此对函数的调用,第一个要解决的问题是参数要如何传递,有的将参数放在栈中,有的将参数放在寄存器中,对于参数压栈的还要确定是从最左边的参数开始压栈,还是从最右边开始,所有这些,就构成了调用规则的内容。
第二个问题是函数如何被调用,其实很简单,就是一个跳转指令JMP,跳到函数的首地址去,并从那里开始执行指令。