汇编指令大全8086?8086下汇编与c混合
- 开发语言
- 2023-09-21
- 60
大家好,关于汇编指令大全8086很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于8086下汇编与c混合的知识点,相信应该可以解决大家的一些困惑和问题,如...
大家好,关于汇编指令大全8086很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于8086下汇编与c混合的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
8086汇编语言子程序调用指令是
调用指令是call,就是为调用设立的
如何快速读懂反汇编的汇编代码
1.掌握计算机组成原理,就算不能掌握也要大致了解,比如cpu的构造,寄存器的种类和作用;程序是如何被执行的,如何改变堆栈相关寄存器的值来实现堆栈的移动等等。
2.在对cpu寄存器的名称和作用了如指掌的情况下,学习8086的汇编指令集。
3.用C写一个简单的程序,最好不要有函数调用的。用gcc编译成.s汇编文件,逐句对照直到完全理解为止。
4.用C写一个有函数调用的程序。再编译成.s汇编文件,看看函数调用如何实现跳转,参数传递,返回值的等等。
这样也才能算是入门,学习汇编绝非一朝一夕就能完成的,基础一定要非常的硬,才不会有汇编阅读的障碍。读懂反汇编,需要在没有汇编阅读障碍基础上更进一步。
汇编语言的类型定义有哪些
不同体系结构的汇编语言各不相同。
比如8086汇编的类型有:程序类型、标号/子程序类型(近标号、远标号、near、far)、数据类型(db、dw、dd、dt、dq、struc)、........
80x86调用函数指令是什么
CALL-调用过程操作码指令说明E8cwCALLrel16相对近调用,位移量相对于下一条指令E8cdCALLrel32相对近调用,位移量相对于下一条指令FF/2CALLr/m16绝对间接近调用,地址由r/m16给出FF/2CALLr/m32绝对间接近调用,地址由r/m32给出9AcdCALLptr16:16绝对远调用,地址由操作数给出9AcpCALLptr16:32绝对远调用,地址由操作数给出FF/3CALLm16:16绝对间接远调用,地址由m16:16给出FF/3CALLm16:32绝对间接远调用,地址由m16:32给出说明将过程链接信息保存到堆栈上,并分支到目标(调用目标)操作数指定的过程(被调用过程)。
目标操作数指定被调用过程中第一条指令的地址。此操作数可以是立即数、通用寄存器或内存位置。此指令可用于执行四种不同类型的调用:近调用-调用当前代码段(CS寄存器当前指向的段)中的过程,有时称为段内调用。远调用-调用当前代码段之外的段中的过程,有时称为段间调用。特权级别间远调用-对特权级别与当前执行程序或过程不同的段中的过程进行的远调用。任务切换-调用不同任务中的过程。后两种调用类型(特权级别间调用与任务切换)只能在保护模式中执行。如需有关近调用、远调用及特权级别间调用的详细信息,请参阅“IA-32英特尔(R)体系结构软件开发人员手册”第1卷第6章中标题为“使用Call与RET调用过程”的部分。如需有关使用CALL指令执行任务切换的详细信息,请参阅“IA-32英特尔(R)体系结构软件开发人员手册”第3卷第6章“任务管理”。近调用。执行近调用时,处理器将EIP寄存器的值(包含CALL指令后面的指令的偏移量)压入堆栈(稍后用作返回指令指针)。然后,处理器分支到当前代码段中由目标操作数指定的地址。目标操作数指定代码段中的绝对偏移量(即相对于代码段基址的偏移量)或相对偏移量(相对于EIP寄存器中指令指针的当前值的有符号位移量,此指针指向CALL指令后面的指令)。执行近调用时,CS寄存器保持不变。对于近调用,绝对偏移量在通用寄存器或内存位置(r/m16或r/m32)中间接指定。操作数大小属性确定目标操作数的大小(16位或32位)。绝对偏移量直接加载到EIP寄存器。如果操作数大小属性是16,则EIP寄存器的两个高位字节清除为零,得到大小最大为16位的指令指针。(使用堆栈指针[ESP]作为基址寄存器来间接访问绝对偏移量时,使用的基址值是ESP在指令执行之前的值)。在汇编代码中,相对偏移量(rel16或rel32)通常指定为标签,但是在机器代码级别,它的编码形式是有符号的16位或32位立即数。此值会加到EIP寄存器中的值上。对于绝对偏移量,操作数大小属性确定目标操作数的大小(16位或32位)。实地址模式或虚8086模式中的远调用。在实地址模式或虚8086模式中执行远调用时,处理器将CS与EIP寄存器的当前值压入堆栈,作为返回指令指针使用。然后,处理器执行指向目标操作数指定的代码段与偏移量的“远分支”操作,以便调用被调用过程。这里,绝对远地址由目标操作数使用指针(ptr16:16或ptr16:32)直接指定,或是使用内存位置(m16:16或m16:32)间接指定。使用指针方法时,被调用过程的段与偏移量在指令中编码,编码时使用4字节(16位操作数大小)或6字节(32位操作数大小)远地址立即数。使用间接方法时,目标操作数指定内存位置,它包含4字节(16位操作数大小)或6字节(32位操作数大小)远地址。操作数大小属性确定远地址中偏移量的大小(16位或32位)。远地址直接加载到CS与EIP寄存器。如果操作数大小属性为16,则EIP寄存器的两个高位字节清除为零。保护模式中的远调用。处理器在保护模式中操作时,CALL指令可用于执行以下三种类型的远调用:相同特权级别远调用。不同特权级别远调用(特权级别间调用)。任务切换(远调用另一项任务)。在保护模式中,处理器总是使用远地址中的段选择器部分访问GDT或LDT中相应的描述符。描述符类型(代码段、调用门、任务门或TSS)与访问权限确定要执行的调用操作类型。如果所选描述符是代码段的,则执行相同特权级别代码段远调用。(如果选择的代码段在另一个特权级别中,并且代码段为非相容代码段,则生成一般保护性异常)。在保护模式中执行的相同特权级别远调用与在实地址模式或虚8086模式中执行的远调用非常相似。绝对远地址由目标操作数使用指针(ptr16:16或ptr16:32)直接指定,或是使用内存位置(m16:16或m16:32)间接指定。操作数大小属性确定远地址中偏移量的大小(16位或32位)。新的代码段选择器及其描述符加载到CS寄存器,相对于指令的偏移量加载到EIP寄存器。请注意,调用门(在下一段叙述)也可用于执行相同特权级别上代码段的远调用。此机制提供了另一层面的间接调用,进行16位与32位代码段之间的调用时,首选这种方法。执行特权级别间远调用时,被调用过程的代码段必须通过调用门访问。目标操作数指定的段选择器确定调用门。同样地,在这里,目标操作数可以使用指针(ptr16:16或ptr16:32)直接指定调用门的段选择器,或是使用内存位置(m16:16或m16:32)间接进行指定。处理器从调用门描述符中获取新代码段的段选择器与新的指令指针(偏移量)。(使用调用门时,忽略目标操作数的偏移量)。执行特权级别间调用时,处理器会切换到被调用过程的特权级别的堆栈。新堆栈段的段选择器在当前运行的任务的TSS中指定。执行堆栈切换之后,分支到新的代码段。(请注意,使用调用门对相同特权级别的段执行远调用时,不会发生堆栈切换)。在新堆栈中,处理器会压入以下值:调用过程堆栈的段选择器与堆栈指针、调用过程堆栈的一组参数(可选),以及调用过程代码段的段选择器与指令指针。(调用门描述符的值确定要将多少个参数复制到新的堆栈)。最后,处理器分支到新代码段中被调用过程的地址。使用CALL指令执行任务切换与通过调用门执行调用存在一定程度的相似。这里,目标操作数指定要切换到的任务的任务门段选择器(忽略目标操作数中的偏移量)。任务门则指向任务的TSS,它包含任务代码与堆栈段的段选择器。TSS还包含挂起任务之前要执行的下一条指令的EIP值。此指令指针值加载到EIP寄存器,以便任务从这个下一条指令再次执行。CALL指令也可直接指定TSS的段选择器,这样就不用间接通过任务门。如需有关任务切换机制的详细信息,请参阅“IA-32英特尔?体系结构软件开发人员手册”第3卷第6章“任务管理”。请注意,使用CALL指令执行任务切换时,会将EFLAGS寄存器中的嵌套任务标志(NT)设置为1,并且会同时加载新TSS的前一个任务链接字段与旧任务的TSS选择器。可以预见,代码会通过执行IRET指令暂停此嵌套任务,由于NT标志已设置为1,此指令将自动使用前一个任务链接返回到调用任务。(如需有关嵌套任务的详细信息,请参阅“IA-32英特尔?体系结构软件开发人员手册”第3卷第6章“任务链接”)。使用CALL指令切换任务与JMP指令在这一点上是不同的,JMP指令不会将NT标志设置为1,因此IRET指令应该不会暂停任务。16位与32位混合调用。在16位与32位代码段之间执行远调用时,应该通过调用门进行。如果是从32位代码段到16位代码段的远调用,则应该从32位代码段的头64KB执行调用。这是因为指令的操作数大小属性设置为16,所以只能保存16位返回地址偏移量。另外,应该使用16位调用门执行调用,以便将16位值压入堆栈。如需有关在16位与32位代码段之间执行调用的详细信息,请参阅“IA-32英特尔(R)体系结构软件开发人员手册”第3卷第16章“16位与32位混合代码”。8086cpu编程结构是什么详细点
以前的机子是80x86的,也就是16位计算,自从80386之后cpu变成了32位的,两者的区别就是存储的数值大小差别,32分高16位与低16位,像ax,bx,cx,dx等寄存器就是用来临时存储数据的,建议买一本汇编语言的书籍看看,个人建议机械工业出版社出版的那本《汇编语言》
汇编语言中的HALT怎么理解
汇编语言中的HALT是暂停指令,该指令使8086/8088进入暂停状态。在暂停状态CPU不进行任何操作,该指令也不影响任何标志。当8086/8088处于暂停状态时,只有以下3种情况之一发生时才能脱离暂停状态:
①RESET线上有复位信号;
②在NMI线上有请求;
③在中断允许情形下(IF=1),在INTR线上有请求。HALT指令可以这样理解,在8088/8086系统中CPU启动后,处理器的指令指针寄存器IP会根据指令长度(顺序执行指令)、指令性质(转移指令、子程序调用指令)在系统时钟驱动下自动做出调整,使程序按指定流向执行,也就是每执行一条指令,IP都或自动增减其值。当执行到HALT指令时,IP在硬件上被冻结,程序暂定,直到上面说的三种脱离暂停状态情况之一出现。
关于汇编指令大全8086和8086下汇编与c混合的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
本文链接:http://xinin56.com/kaifa/29376.html