精华内容
下载资源
问答
  • 汇编之控制转移指令之子程序、中断指令和系统功能调用前言子程序CALL调用指令RET返回指令中断指令和系统功能调用中断与中断源中断种类中断向量软中断指令中断响应过程中断嵌套中断处理程序设计设置中断向量DOS系统...


    前言

    子程序

    在汇编语言中将某些具有独立功能的部分编写成独立的程序模块,称之为子程序。
    在这里插入图片描述

    CALL调用指令

    在这里插入图片描述
    段内调用也分直接和间接;
    段间调用也分直接和间接。
    在这里插入图片描述
    段内调用,只需要IP进栈
    段间调用,需要IP和CS进栈

    RET返回指令

    中断指令和系统功能调用

    中断与中断源

    中断种类

    中断向量

    软中断指令

    中断响应过程

    中断嵌套

    中断处理程序设计

    设置中断向量

    DOS系统功能调用

    展开全文
  • 子程序调用和中断指令

    千次阅读 2007-05-20 17:25:00
    子程序的调用及返回指令1.调用call dst;调用的时候ip或eip压栈将机器执行的当前值(即call指令的下一条指令的地址)压入堆栈以便子程序返回用。2.返回ret返回时ip出栈带参数的返回指令 ret NN是一个16位的常数(偶数...

    子程序的调用及返回指令

    1.调用call dst;
    调用的时候ip或eip压栈将机器执行的当前值(即call指令的下一条指令的地址)压入堆栈以便子程序返回用。
    2.返回ret
    返回时ip出栈
    带参数的返回指令 ret N
    N是一个16位的常数(偶数),该指令是将返回地址弹入ip或eip后在执行sp/esp+N -->sp/esp.
    该指令允许返回地址出栈后修改堆栈的指针,这便于调用子程序以前把子程序所需要的参数入栈,
    以便子程序运行时使用这些参数。当子程序返回后,这些参数已不再使用,就可以修改指针使其指向参数入栈
    以前的值。

    中断指令
    中断服务程序可以被认为是一种特殊的子程序,可以被存放在主存的任何位置。中断服务程序的首(起始、入口)地址,被安排在中断向量表中。
          中断向量表设置在主存的最低1KB区域内,物理地址000H ~ 3FFH。向量表从0开始,每4个字节(双字)对应一个中断,低字存放中断服务程序的偏移地址IP,高字存放其段地址CS。中断向量号n的中断服务程序存放在中断向量表4×n的物理地址处。
          中断时,为保证中断服务程序正确返回原来的程序,要把被中断程序的断点处逻辑地址CS : IP压入堆栈保存,还要保存反映现场状态的标志寄存器FLAGS。然后,将中断服务程序的入口地址送CS和IP寄存器转去执行中断服务程序。
          中断服务程序执行完后返回原程序时,应恢复堆栈中保存的断点地址CS : IP,以及标志寄存器。中断返回指令IRET实现从中断服务程序返回原程序
      1. int n   ;产生中断类型为n的中断
      2. into;溢出中断指令
      3. iret;中断返回指令 相关内容要出栈


    int 21h;系统功能调用指令
    通过用int 21h;再调用每个功能事先规定的功能号,就可以进入相应的中断服务程序入口。

    如何使用21号中断?
    答:把功能调用编号置于寄存器AH中,设置入口参数,cpu执行int 21h,最后给出出口参数。
    举例:
    mov ah,1;功能号01h->ah
    int 21h;调用21h号软中断
    功能:等待键盘输入,并回送显示器。

    mov dl,41h;       将字符A的ASCII码,送->DL
    mov ah,2;         21h的2软中断,将dl内容显示到屏幕上
    int 21h

    mov ah,4ch;
    int 21h;  功能号4ch终止程序,返回dos

     

    展开全文
  • INT(软件中断指令)是CALL指令的一种特殊形式。call指令调用调用的子程序是用户程序的一部分,而INT指令调用的操作系统提供的子程序或者其他特殊的子程序。 中断服务子程序标准过程的最大区别是 汇编程序可以...

    INT(软件中断指令)是CALL指令的一种特殊形式。call指令调用调用的子程序是用户程序的一部分,而INT指令调用的操作系统提供的子程序或者其他特殊的子程序。

     

    中断服务子程序和标准过程的最大区别是 汇编程序可以有任意个过程,中断服务子程序最多有256个过程、

     

    INT指令共有四中不同的格式:

     

    《1》  int n

      n是中断号,这就允许用户程序调用256个中断服务子程序。

      该指令2字节长度,第一字节是int机器码,第二字节是8位立即数,表示中断号。

      CPU在执行到INT指令时,通过中断描述符表找到中断号对应的中断服务子程序的地址,(本质上就是一个异常处理程序的软件调用)

    《2》 int 3

      INT 3 是中断指令的一种特殊形式,仅有一个字节长。

      调试器将该指令当作软件中断指令来用。调试的时候,当程序中的某一位置加断点的时候,调试器会把断点处指令编码的第一个字节替换为INT 3指令的编码。

    当程序执行到INT 3,回向调试器申请系统调用,调试器因此获得CPU控制权。之后,再用原先的编码替换INT 3 编码。

     

     

    《3》INTO    中断号4

      如果溢出标志位为1,则INTO指令会产生一个软件中断,利用这个指令可以快速测试算术运算指令之后是否有溢出产生。

    《4》BOUND  中断号5

      BOUND reg,mem

      其执行算法为:if(reg<[mem])or(reg>[mem+sizeof(reg)]) then INT 5

      判断数组下表是否在合理范围内,不合理触发INT 5 中断,返回地址仍是BOUND

     

     

     不管是哪种,都会发生

    (1)标志寄存器入栈

    (2)CS:EIP 寄存器入栈,

    (3)通过中断号在中断描述符表中找到对应的描述符,并将对应的数据放入CS:EIP中、

     

    CS入栈和出栈都是一个32位值,只有低16位有效。扩充的高16位无定义,目的是使堆栈保持与4字节边界对齐。这对80386的性能来说很重要。。。么。。。。。

    转载于:https://www.cnblogs.com/icqw/p/4915930.html

    展开全文
  • INT(软件中断指令)是CALL指令的一种特殊形式。call指令调用调用的子程序是用户程序的一部分,而INT指令调用的操作系统提供的子程序或者其他特殊的子程序。 中断服务子程序标准过程的最大区别是 汇编程序可以...

    INT(软件中断指令)是CALL指令的一种特殊形式。call指令调用调用的子程序是用户程序的一部分,而INT指令调用的操作系统提供的子程序或者其他特殊的子程序。

     

    中断服务子程序和标准过程的最大区别是 汇编程序可以有任意个过程,中断服务子程序最多有256个过程、

     

    INT指令共有四中不同的格式:

     

    《1》  int n

      n是中断号,这就允许用户程序调用256个中断服务子程序。

      该指令2字节长度,第一字节是int机器码,第二字节是8位立即数,表示中断号。

      CPU在执行到INT指令时,通过中断描述符表找到中断号对应的中断服务子程序的地址,(本质上就是一个异常处理程序的软件调用)

    《2》 int 3

      INT 3 是中断指令的一种特殊形式,仅有一个字节长。

      调试器将该指令当作软件中断指令来用。调试的时候,当程序中的某一位置加断点的时候,调试器会把断点处指令编码的第一个字节替换为INT 3指令的编码。

    当程序执行到INT 3,回向调试器申请系统调用,调试器因此获得CPU控制权。之后,再用原先的编码替换INT 3 编码。

     

     

    《3》INTO    中断号4

      如果溢出标志位为1,则INTO指令会产生一个软件中断,利用这个指令可以快速测试算术运算指令之后是否有溢出产生。

    《4》BOUND  中断号5

      BOUND reg,mem

      其执行算法为:if(reg<[mem])or(reg>[mem+sizeof(reg)]) then INT 5

      判断数组下表是否在合理范围内,不合理触发INT 5 中断,返回地址仍是BOUND

     

     

     不管是哪种,都会发生

    (1)标志寄存器入栈

    (2)CS:EIP 寄存器入栈,

    (3)通过中断号在中断描述符表中找到对应的描述符,并将对应的数据放入CS:EIP中、

     

    CS入栈和出栈都是一个32位值,只有低16位有效。扩充的高16位无定义,目的是使堆栈保持与4字节边界对齐。这对80386的性能来说很重要。。。么。。。。。

     

     

     

    =====

    摘要:平常编程调试的过程中,我们可能会有这样的疑惑:“为什么使用硬件模拟器,比如bochs调试的时候,开始设置的调试断点都不会生效?”,“断点调试的本质是什么,为什么程序能够在特定的地方停留下来?既然程序是指令流,为何CPU没有一直执行下去?”,“在软件中断的情况下,如何进行调试?”。断点和单步执行是两个经常使用的调试功能,也是调试器的核心功能。本章我们将介绍IA-32 CPU是如何支持断点和单步执行功能的,然后逐一为你解答这些疑问。

    1.软件断点

    x86系列处理器从其第一代产品英特尔8086开始就提供了一条专门用来支持调试的指令,即INT 3。简单地说,这条指令的目的就是使CPU中断(break)到调试器,以供调试者对执行现场进行各种分析。当我们调试程序时,可以在可能有问题的地方插入一条INT 3指令,使CPU执行到这一点时停下来。这便是软件调试中经常用到的断点(breakpoint)功能,因此INT 3指令又被称为断点指令。

    下面,我们来测试一个程序:
    1    #include<stdio.h>
    2    #include<stdlib.h>
    3    #include<unistd.h>
    4    
    5    int main()
    6    {
    7        printf("hello world");
    8        __asm__("int $0x03");
    9        printf("hello world");
    10        return 0;
    11    }

    编译:gcc hello.c -o hello
    调试:gdb hello 
    (gdb) r
    Starting program: /home/huangyk/doc/major/操作系统/hello 
    Program received signal SIGTRAP, Trace/breakpoint trap.
    main () at hello.c:9
    9        printf("hello world");


    可以看到,即使我们不在调试器中设置断点,也能正常中断
    查看当前堆栈,定位IP(在64b机器下面,是rip)

    (gdb) info frame
    Stack level 0, frame at 0x7fffffffdaa0:
     rip = 0x4004db in main (hello.c:9); saved rip 0x30b3a1ed1d
     source language c.
     Arglist at 0x7fffffffda90, args: 
     Locals at 0x7fffffffda90, Previous frame's sp is 0x7fffffffdaa0
     Saved registers:
      rbp at 0x7fffffffda90, rip at 0x7fffffffda98

    查看内存区域的对应数据
    (gdb) x/10i $rip-20
       0x4004c7 <main+3>:    in     $0xb8,%eax
       0x4004c9 <main+5>:    clc    
       0x4004ca <main+6>:    add    $0x89480040,%eax
       0x4004cf <main+11>:    (bad)  
       0x4004d0 <main+12>:    mov    $0x0,%eax
       0x4004d5 <main+17>:    callq  0x4003b8 <printf@plt>
       0x4004da <main+22>:    int3   
    => 0x4004db <main+23>:    mov    $0x4005f8,%eax
       0x4004e0 <main+28>:    mov    %rax,%rdi
       0x4004e3 <main+31>:    mov    $0x0,%eax

    我们可以清楚看见,刚才执行了一个int 3指令。断点异常(INT 3)属于陷阱类异常,当CPU产生异常时,其程序指针是指向导致异常的下一条指令的。
    注意:在windows其他的调试器中不是这样,eip被设定成指向int 3指令。

    2.在调试器中设置断点

    考虑一下调试器是如何设置断点的。当我们在调试器中对代码的某一行设置断点时,调试器会先把这里的本来指令的第一个字节保存起来,然后写入一条INT 3指令。因为INT 3指令的机器码为11001100b(0xCC),仅有一个字节,所以设置和取消断点时也只需要保存和恢复一个字节,这是设计这条指令时须考虑好的。

    我们将这个程序的汇编部分去掉,然后在line 8设置断点,接着调试:
    (gdb) b 8
    Breakpoint 1 at 0x4004da: file hello2.c, line 8.
    (gdb) r
    Starting program: /home/huangyk/doc/major/操作系统/two 
     
    Breakpoint 1, main () at hello2.c:8
    8        printf("hello world");
    Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.x86_64
    (gdb) x/10i $rip-20
       0x4004c6 <main+2>:    mov    %esp,%ebp
       0x4004c8 <main+4>:    mov    $0x4005f8,%eax
       0x4004cd <main+9>:    mov    %rax,%rdi
       0x4004d0 <main+12>:    mov    $0x0,%eax
       0x4004d5 <main+17>:    callq  0x4003b8 <printf@plt>
    => 0x4004da <main+22>:    mov    $0x4005f8,%eax
       0x4004df <main+27>:    mov    %rax,%rdi
       0x4004e2 <main+30>:    mov    $0x0,%eax
       0x4004e7 <main+35>:    callq  0x4003b8 <printf@plt>
       0x4004ec <main+40>:    mov    $0x0,%eax


    你看到了什么?怎么没有int 3指令呢?
    值得说明的是,在调试器下,我们是看不到动态替换到程序中的INT 3指令的。大多数调试器的做法是在被调试程序中断到调试器时,会先将所有断点位置被替换为INT 3的指令恢复成原来的指令,然后再把控制权交给用户。

    3.断点命中
    当CPU执行到INT 3指令时,由于INT 3指令的设计目的就是中断到调试器,因此,CPU执行这条指令的过程也就是产生断点异常(breakpoint exception,简称#BP)并转去执行异常处理例程的过程。在跳转到处理例程之前,CPU会保存当前的执行上下文,包括段寄存器、程序指针寄存器等内容。

    注意:断点命中之后的中断服务程序是调试器来定义的,然后将服务入口注册到IDT中。

    4.恢复执行

    这里有一个问题,前面我们说当断点命中中断到调试器时,调试器会把所有断点处的INT 3指令恢复成本来的内容。因此,在用户发出了恢复执行命令后,调试器在通知系统真正恢复程序执行前,调试器需要将断点列表中的所有断点再落实一遍。但是对于刚才命中的这个断点需要特别对待,试想如果把这个断点处的指令也替换为INT 3,那么程序一执行便又触发断点了。但是如果不替换,那么这个断点便没有被落实,程序下次执行到这里时就不会触发断点,而用户并不知道这一点。对于这个问题,大多数调试器的做法都是先单步执行一次。也就是说,先设置单步执行标志(下一节将详细讨论),然后恢复执行,将断点所在位置的指令执行完。因为设置了单步标志,所以,CPU执行完断点位置的这条指令后会立刻再中断到调试器中,这一次调试器不会通知用户,会做一些内部操作后便立刻恢复程序执行,而且将所有的断点都落实(使用INT 3替换)。如果用户在恢复程序执行前,已经取消了当前的断点,那么就不需要先单步执行一次了。

    5.特别用途—— 烫烫烫烫烫

    因为INT 3指令的特殊性,所以它有一些特别的用途。让我们从一个有趣的现象说起。当我们用VC6进行调试时,常常会观察到一块刚分配的内存或字符串数组里面被填充满了"CC"。如果是在中文环境下,因为0xCCCC恰好是汉字"烫"字的简码,所以会观察到很多"烫烫烫……",而0xCC又正好是INT 3指令的机器码,这是偶然的么?答案是否定的。因为这是编译器故意这样做的。为了辅助调试,编译器在编译调试版本时会用0xCC来填充刚刚分配的缓冲区。这样,如果因为缓冲区或堆栈溢出时程序指针意外指向了这些区域,那么便会因为遇到INT 3指令而马上中断到调试器。

    6.系统对int 3的优待

    关于INT 3指令还有一点要说明的是,INT 3指令与当n=3时的INT n指令(通常所说的软件中断)并不同。INT n指令对应的机器码是0xCD后跟1字节n值,比如INT 23H 会被编译为0xCD23。与此不同的是,INT 3指令具有独特的单字节机器码0xCC。而且系统会对INT 3指令给予一些特殊的待遇,比如在虚拟8086模式下免受IOPL检查等。

    7.为什么看不到调试期写入的int 3指令
    因为,调试器总是“执行到b line,替换为int 3指令,调用中断,恢复int 3之前的指令,将现场返回给用户”,所以,int 写入但是又被置换,整个过程对用于是透明的。

    8.归纳与解惑

    因为使用INT 3指令产生的断点是依靠插入指令和软件中断机制工作的,因此人们习惯把这类断点称为软件断点,软件断点具有如下局限性。

    属于代码类断点,即可以让CPU执行到代码段内的某个地址时停下来,不适用于数据段和I/O空间。

    对于在ROM(只读存储器)中执行的程序(比如BIOS或其他固件程序),无法动态增加软件断点。因为目标内存是只读的,无法动态写入断点指令。这时就要使用我们后面要介绍的硬件断点。

    在中断向量表或中断描述表(IDT)没有准备好或遭到破坏的情况下,这类断点是无法或不能正常工作的,比如系统刚刚启动时或IDT被病毒篡改后,这时只能使用硬件级的调试工具。

    虽然软件断点存在以上不足,但因为它使用方便,而且没有数量限制(硬件断点需要寄存器记录断点地址,有数量限制),所以目前仍被广泛应用。

    回到我们最开始提出的问题:由于调试是和调试期密切相关的,在用bochs+freedos 来调试操作系统的时候,如果在我们自己的操作系统起来之前,这时候不满足软件中断的使用条件,所以会设置断点失败,需要利用硬件中断,xchg bx,bx;进入到系统之后,然后就可以使用正常的软件中断了。


    参考:<软件调试>第四章第一节http://book.51cto.com/art/200812/100663.htm
    ————————————————
    版权声明:本文为CSDN博主「谁不小心的」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/trochiluses/article/details/20209593

    展开全文
  • ARM 软中断指令SWI

    万次阅读 多人点赞 2016-03-01 22:35:40
    前面我们学习ARM工作模式中,处理器模式切换可以通过软件控制进行切换...于是ARM指令集中提供了两条产生异常的指令,通过这两条指令可以用软件的方法实现异常,其中一个就是中断指令SWI 。   一、软件中断  软中
  • 程序中断和调用子程序有何区别

    万次阅读 多人点赞 2015-12-01 00:57:31
    1)调用子程序发生的时间是已知的固定的,即在主程序的调用指令(CALL)执行时发生主程序调用子程序过程,调用指令所在位置是已知的固定的;而中断过程发生的时间一般是随机的,CPU在执行某一主程序时受到中断源...
  • 最近学习Linux操作系统,关于中断系统调用和进程的级别总是感觉有些模糊的地方,特在此做个小结,整理下思路。 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去...
  • 中断指令 INT

    千次阅读 2011-03-21 20:47:00
    最好把int的指令都列出来啊 谢谢啦~~~~ 最佳答案21H 系统功能调用 40H Basic保留 0H 除以零 1H 单步(用于DEBUG) 2H 非屏蔽中断 3H 断点指令(用于DEBUG) 4H 溢出 5H 打印屏幕 6H 保留 7H...
  • 特权指令 访管指令 与 用户态核心态 系统调用

    千次阅读 多人点赞 2019-11-05 00:22:19
    指令系统角度,在指令系统中存在用于管理硬件整个系统安全的指令,让程序随意使用具有极高危险性。不得在用户态(目态)执行,只能在核心态(管态)执行,用户态程序如果运行特权指令则会被中断出错。所以用户...
  • 对软中断指令INT的理解

    千次阅读 2019-05-16 21:41:34
    格式:INT N 功能:转到相应中断处理程序执行 举例: mov ah,1;...INT N就好像调用一个子程序,只是INT N调用的是中断处理程序罢了。 详解: int 21h时,程序会先(2 * 16 * 16 + 16 )*...
  • OS-中断,异常系统调用

    千次阅读 2017-08-05 08:13:46
    如下图所示,包括中断,异常,正常的通过函数库调用内核的操作接口。三者不同 源头不同: 中断:外设 异常:应用程序意想不到的行为 系统调用:应用程序请求操作提供服务 响应方式: 中断:异步 异常:
  • CPU由运算器控制器组成。 1、控制器的功能 取指令,把指令从内存单元中取出 分析指令,对指令的操作码部分进行阶码,分析这条指令要完成什么功能,是指令集中哪一条指令 执行指令,CPU的控制器发出各种操作...
  • 调用指令

    千次阅读 2011-09-18 22:21:34
    硬件堆栈用来保存调用子程序的返回地址,软件堆栈用来保存局部变量工作寄存器。   一般会把返回地址自动存入堆栈,而没有被单片机自动入栈但是也需要保存的内容比如状态寄存器、通用寄存器等,就得通过PUSH等...
  • 中断、异常、系统调用在OS计算机组成原理中都经常被提到,很难区分,并且不同版本的教材往往有不同的说法。这里主要采用《CSAPP》中的说法区分一下中断、异常、系统调用。 主要内容如下: 术语说明 异常流 ...
  • 一. 内容总览 二. 中断机制的诞生 三. 中断的概念作用 ...用户态、核心态之间的切换是怎么实现的?... 如系统调用时使用的访管指令(又叫陷入指令、trap指令) 强迫中断 原因: 硬件故障 如:缺页
  • 中断的来源是外设 异常的来源是不良的程序软件的非法指令等等 系统调用的来源应用程序主动向操作系统发出的合法服务请求 ...依据内部或者外部事件设置中断标志,产生中断号,然后依据中断向量表调用...
  • 中断返回指令

    千次阅读 2009-05-02 09:30:00
    为了实现此项功能,指令系统提供了一条专用的中断返回指令。该指令的格式如下: IRET/IRETD 该指令执行的过程基本上是INT指令的逆过程,具体如下: ◆、从栈顶弹出内容送入IP; ◆、再从新栈顶弹出内容送入CS; ◆、...
  • 中断调用和子程序的调用的异同

    千次阅读 2013-06-06 18:08:00
    1、两过程定义与作用 子程序是微机基本程序结构中的1种,基本程序结构包括顺序(简单)、分支(判断)、循环、子程序...一般微机首先执行主程序,碰到调用指令就转去执行子程序,子程序执行完后,返回指令就返回主程...
  • 原语 操作系统或计算机网络用语范畴。...primitive or atomic action 是由若干个机器指令构成的完成某种特定功能的一段程序,具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断。 ...
  • 中断、异常系统调用

    千次阅读 2018-07-24 15:23:53
    为什么需要中断、异常系统调用? 1 在操作系统中有很多的应用程序需要操作系统提供服务,但是这些应用程序不能完全信任,而操作系统内核是被信任的第三方。只有内核可以执行特权指令,方便为应用程序提供服务。 ...
  • 操作系统 中断异常系统调用

    千次阅读 2017-11-06 20:26:53
    一、处理器状态 处理器由运算器、控制器、一系列寄存器高速缓存构成 两类寄存器: ...程序计数器(PC):记录将要取出的指令的地址指令寄存器(IR):记录最近取出的指令程序状态字(PSW:Program Status
  • 中断与函数调用的区别

    千次阅读 2017-08-04 00:17:00
    在《微机原理》《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过...
  • 1.子程序调用是预先安排好的,程序中断是随机发生的; 2.调用子程序,是为主程序...3.子程序是由调用指令给出目标地址,中断是通过隐指令获得中断服务程序的入口地址     中断服务程序 调用子程 序随机产生的
  • 1、两过程定义与作用 子程序是微机基本程序结构中的1种,基本程序结构包括顺序(简单)、分支(判断)、循环、...一般微机首先执行主程序,碰到调用指令就转去执行子程序,子程序执行完后,返回指令就返回主程序断点...
  • 操作系统——中断、异常系统调用比较

    万次阅读 多人点赞 2015-08-09 14:09:51
    我们首先要明确,为什么操作系统需要中断、异常系统调用:  在计算机运行时,内核是被信任的第三方 只有内核才可以执行特权指令 方便应用程序  接下来我们先简单了解一下三者的概念:   系统调用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 141,036
精华内容 56,414
关键字:

中断指令和调用指令