X86汇编语言:从实模式到保护模式--命令篇

这篇具有很好参考价值的文章主要介绍了X86汇编语言:从实模式到保护模式--命令篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

X86汇编语言:从实模式到保护模式–命令篇

补充汇编命令

注:不能直接将内存赋值给内存,也不能将立即数直接赋值给段寄存器(CS DS ES SS),但是可以将内存直接赋值给段寄存器

  1. div:使用操作数作为除数,除以被除数(无符号除法)。
    • 如果除数的长度为8位,则只使用AX作为被除数,执行除法后商存储在AL中,余数存储在AH中。
    • 如果除数的长度为16位,则使用DX:AX作为被除数,执行除法后商存储在AX中,余数存储在DX中。
  2. idiv:有符号除法
mov ax, 0x0400
mov bl, 0xf0
idiv bl
  1. sub:
sub ah, al

;可以等价为如下

neg  al
add ah, al
  1. neg:用0减去指令中指定的操作数

  2. cmp:比较两个数,如果相等则将ZF置1,否则置0。

  3. cbw(Convert Byte to Word):将字节扩展至字

  4. cwd(Convert Word to Double-word):将字扩展至双字

  5. jns:条件转移指令,执行时要参考标志寄存器的符号位SF,如果SF不为1则跳转,否则不跳转

  6. jmp指令

    • jcxz:当CX寄存器内容为0时进行转移。
    • jmp short xxx:相对短转移,操作码位0xEB,该指令属于段内转移指令,长度为2字节,只允许-128–127字节的地方。
    • jmp near xxxx:16位相对近转移,操作码0xE9,是段内转移,长度位3字节,转移范围为-32768–32767。
    • jmp (near) xxxx:16位简介绝对近转移,由16位通用寄存器博保存。jmp near bx, jmp near cx,jmp [bx+si]
    • jmp 0x0000:0x7c00:16位直接绝对远转移(字节码EA 00 7C 00 00),直接给出段地址和偏移地址。
    • jmp far [0x04]:该指令执行时,会访问段寄存器DS所指向的数据段,并从0X04偏移地址处取出两个字保存至IP和CS中(低地址[0x04–0x05]保存了IP,高地址[0x06-0x07]保存了CS)
  7. call:

    • call near (标号或者立即数):16位相对近调用,当前代码段内的call,near不是必须的
      call 0x5000							-> E8 xxxx
      call proc_1
      
    • call (寄存器或者内存地址):16位简介绝对调用,也是一种近调用,只能调用当前代码段内的过程,指令中的操作数不是偏移量,二十被调用过程的真实地址,故称为绝对调用。需要用16位通用寄存器或者16位内存单元给出。(可以调用当前代码段内的任意一个过程,不像相对近调用只能调用-32768到32767字节范围的数据)
      	call cx 								-> FF D1
      	call [0x3000]					-> FF 16 00 30
      	call [bx]							
      	call [bx + si + 0x02]
      
    • call :直接绝对远调用,段间调用。
      	call 0x2000:0x0030			->9A 30 00 00 20
      
    • call :16位简介绝对远调用,也属于段间调用,被第哦啊用过程位于另一个代码段中
      call far [0x2000]
      call far [proc_1]		;执行这句的时候处理器会从段寄存器DS指向的数据段,结合指令中的偏移地址,取出两个字。以此取代CS个IP内的值。
      call far [bx]
      call far [bx + si]	
      
  8. ret和retf:与call和call far配对。

    • ret是近返回指令,处理器从堆栈中弹出一个字到IP中。
    • retf是远返回指令,处理器分别弹出两个字到IP和CS中。
  9. shr:逻辑右移指令

  10. shl:逻辑左移指令文章来源地址https://www.toymoban.com/news/detail-755786.html

伪指令

    • resb:从当前位置开始,保留指定数量的字节,但不初始化。
    • resw:声明未初始化的字
    • resd:声明未初始化的双字

到了这里,关于X86汇编语言:从实模式到保护模式--命令篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 汇编语言笔记(一)——汇编语言基础

    一、开发环境 我使用visual studio 2022 preview,其他版本的设置大同小异。 第一步: 打开visual studio,点击“创建新项目”: 第二步: visual studio并没有专门的汇编项目,所以需要挂羊头卖狗肉,选择C++空项目 第三步: 输入项目名称,点击创建 第四步: 鼠标右键单击项目名称—

    2024年02月05日
    浏览(30)
  • 汇编语言—常见汇编指令汇总

    mov    寄存器 ,数据                如:mov ax ,8 mov   寄存器,寄存器              如:mov ax,bx mov   寄存器,内存单元          如:mov ax,[0] mov   内存单元,寄存器          如:mov [0],ax mov   段寄存器,寄存器          如:mov ds,ax add   寄存器,数据

    2024年02月10日
    浏览(28)
  • 5.6 汇编语言:汇编高效数组寻址

    数组和指针都是用来处理内存地址的操作,二者在C语言中可以互换使用。数组是相同数据类型的一组集合,这些数据在内存中是连续存储的,在C语言中可以定义一维、二维、甚至多维数组。多维数组在内存中也是连续存储的,只是数据的组织方式不同。在汇编语言中,实现

    2024年02月11日
    浏览(32)
  • 5.8 汇编语言:汇编高效除法运算

    通常情况下计算除法会使用 div/idiv 这两条指令,该指令分别用于计算无符号和有符号除法运算,但除法运算所需要耗费的时间非常多,大概需要比乘法运算多消耗10倍的CPU时钟,在Debug模式下,除法运算不会被优化,但Release模式下,除法运算指令会被特定的算法经过优化后转

    2024年02月11日
    浏览(33)
  • 5.7 汇编语言:汇编高效乘法运算

    乘法指令是一种在CPU中实现的基本算术操作,用于计算两个数的乘积。在汇编语言中,乘法指令通常是通过 mul(无符号乘法) 和 imul(有符号乘法) 这两个指令实现的。由于乘法指令在执行时所消耗的时钟周期较多,所以编译器在优化代码时通常会尝试将乘法操作转换为更

    2024年02月11日
    浏览(21)
  • 汇编语言第一讲:计算机的组织架构和汇编语言介绍

    第一讲:计算机的组织架构和汇编语言介绍 汇编语言 计算机组织架构 数字电路 术语回顾 数制 数字电路 硬件电路 数字电路的问题 汇编语言的开始 程序的节(sections) 调用操作系统的系统调用 列出文件(Listing files) 汇编和链接 调试汇编程序 反汇编现有的程序 附录 课程资源

    2024年04月09日
    浏览(38)
  • 5.10 汇编语言:汇编过程与结构

    过程的实现离不开堆栈的应用,堆栈是一种后进先出 (LIFO) 的数据结构,最后压入栈的值总是最先被弹出,而新数值在执行压栈时总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。 栈是由 CPU 管理的线性内存数组,它使用两个寄存器 (S

    2024年02月11日
    浏览(29)
  • 南京邮电大学汇编语言程序设计实验一(汇编语言语法练习与代码转换)

    排除语法错误:给出的是一个通过比较法完成8位二进制数转换成十进制数送屏幕显示功能的汇编语言源程序,但有很多语法错误。要求实验者按照原样对源程序进行编辑,汇编后,根据TASM给出的信息对源程序进行修改,知道没有语法错误为止。然后进行链接,并执行相应可

    2024年02月08日
    浏览(45)
  • 低级语言汇编真的各个面不如汇编吗?

    今日话题,低级语言汇编真的各个面不如C语言吗?C语言因其可移植性、开发效率和可读性而在各领域广泛使用,市场占有率极高。然而,汇编语言在特定场景下仍然具有独特优势,稳固地占据一席之地。如果你对这方面感兴趣,我可以分享一套包含各类语言和嵌入式行业教

    2024年02月06日
    浏览(32)
  • 在C语言中调用汇编语言的函数

    在C语言中调用汇编文件中的函数,要做的主要工作有两个: 一是在C语言中声明函数原型,并加extern; 二是在汇编中用EXPORT导出函数名,并用该函数名作为汇编代码段的标识,最后用mov pc, lr返回。然后,就可以在C语言中使用该函数了。 从C语言的角度,并不知道该函

    2024年02月14日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包