汇编指令概述 ATT汇编基本语法

news/2024/11/29 6:43:11/

操作系统

南大 计算机体系结构

性能分析 建模

深入理解计算机系统CMU15213_课件

深入理解计算机系统-笔记-第一章-计算机系统漫游

uCore OS实验指导书和源码网址 (2017)

How-to-Make-a-Computer-Operating-System 各章节代码

linux 系统编程

双系统安装

ucore实验中的常用工具

在ucore实验中,一些基本的常用工具如下:

  • 命令行shell: bash shell – 有对文件和目录操作的各种命令,如ls、cd、rm、pwd…

  • 系统维护工具:apt、git

    • apt:安装管理各种软件,主要在debian, ubuntu linux系统中
    • git:开发软件的版本维护工具
  • 源码阅读与编辑工具:eclipse-CDT、understand、gedit、vim

    • Eclipse-CDT:基于Eclipse的C/C++集成开发环境、跨平台、丰富的分析理解代码的功能,可与qemu结合,联机源码级Debug uCore OS。
    • Understand:商业软件、跨平台、丰富的分析理解代码的功能,Windows上有类似的sourceinsight软件
    • gedit:Linux中的常用文本编辑,Windows上有类似的notepad
    • vim: Linux/unix中的传统编辑器,类似有emacs等,可通过exuberant-ctags、cscope等实现代码定位
  • 源码比较和打补丁工具:diff、meld,用于比较不同目录或不同文件的区别, patch是打补丁工具

    • diff, patch是命令行工具,使用简单

    • meld是图形界面的工具,功能相对直观和方便,类似的工具还有 kdiff3、diffmerge、P4merge

    • Beyond Compare window 下的文件比较工具 http://www.beyondcompare.cc/ 需要激活

    • BC 2.0 KEY:

      urKH3mXZVDiTNgCKQnFnfvaQB5tTtahv
      tUr5HqwT9YZu50+b3T9bkzYKwKsfjhhi
      DgzR9Dr5qbmJ2EmNzYfSAq4ocM7E8B0D
      kDvyvawgHd0gV-nFnVNBsqMgnxcKoJfZ
      6WrrQotEiqs6H14Jk9Wjz+SLvovnUksb
      gT5K1ey7T7AV2C32NLt4gjavcM5tzDR0
      GUbvAou+MKzhMHebccC+3fB0wwwKNPs0
      fwCz3Xh16S6yB4xxeD2bS6JFV9JPZwkA
      
    • BC 3.0 KEY:

      mv1nPlXAywBDCdhxFc9QOVv6TBcQHLAXBQUAKTh3ie4fqSEOnWrPsnVkF
      yt0wAkJHweoExRJWWVwwCniKNROSdJzJXE6YVapYW7f+tRRXRFI4yn4Nj
      jZ0RiiqGRCTVzwComUcXB-eiFWRBY6JpSsCNkmIxL5KsRCo442djHhTZE 
      
  • 开发编译调试工具:gcc 、gdb 、make

    • gcc:C语言编译器
    • gdb:执行程序调试器
    • ld:链接器
    • objdump:对ELF格式执行程序文件进行反编译、转换执行格式等操作的工具
    • nm:查看执行文件中的变量、函数的地址
    • readelf:分析ELF格式的执行程序文件
    • make:软件工程管理工具, make命令执行时,需要一个 makefile 文件,以告诉make命令如何去编译和链接程序
    • dd:读写数据到文件和设备中的工具
  • 硬件模拟器:qemu – qemu可模拟多种CPU硬件环境,本实验中,用于模拟一台 intel x86-32的计算机系统。类似的工具还有BOCHS, SkyEye等

  • markdown文本格式的编写和阅读工具(比如阅读ucore_docs)

    • 编写工具 haroopad
    • 阅读工具 gitbook

上述工具的使用方法在线信息

apt-get

git github1
git github2

  • diff patch
    • http://www.ibm.com/developerworks/cn/linux/l-diffp/index.html
    • http://www.cnblogs.com/itech/archive/2009/08/19/1549729.html
  • gcc
    • http://wiki.ubuntu.org.cn/Gcchowto
    • http://wiki.ubuntu.org.cn/Compiling_Cpp
    • http://wiki.ubuntu.org.cn/C_Cpp_IDE
    • http://wiki.ubuntu.org.cn/C%E8%AF%AD%E8%A8%80%E7%AE%80%E8%A6%81%E8%AF%AD%E6%B3%95%E6%8C%87%E5%8D%97
  • gdb
    • http://wiki.ubuntu.org.cn/%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F
  • make & makefile
    • http://wiki.ubuntu.com.cn/index.php?title=%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile&variant=zh-cn
    • http://blog.csdn.net/a_ran/article/details/43937041
  • shell
    • http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80
    • http://wiki.ubuntu.org.cn/%E9%AB%98%E7%BA%A7Bash%E8%84%9A%E6%9C%AC%E7%BC%96%E7%A8%8B%E6%8C%87%E5%8D%97
  • understand
    • http://blog.csdn.net/qwang24/article/details/4064975
  • vim
    • http://www.httpy.com/html/wangluobiancheng/Perljiaocheng/2014/0613/93894.html
    • http://wenku.baidu.com/view/4b004dd5360cba1aa811da77.html
  • meld
    • https://linuxtoy.org/archives/meld-2.html
  • qemu
    • http://wenku.baidu.com/view/04c0116aa45177232f60a2eb.html
  • Eclipse-CDT
    • http://blog.csdn.net/anzhu_111/article/details/5946634
  • haroopad
    • http://pad.haroopress.com/
  • gitbook
    • https://github.com/GitbookIO/gitbook https://www.gitbook.com/

1. 汇编指令概述 AT&T汇编基本语法

x86汇编的两种语法:intel语法和AT&T语法
x86汇编一直存在两种不同的语法,在intel的官方文档中使
用intel语法,Windows也使用intel语法,而UNIX平台的汇编器一
直使用AT&T语法,所以本书使用AT&T语法。AT&T格式的汇编,与Intel格式的汇编有一些不同。二者语法上主要有以下几个不同:
    1. 寄存器命名原则AT&T格式: %eax                      Intel格式: eax寄存器前面加"%",以便跟符号名区分开。2./目的操作数顺序    -->AT&T格式: movl %eax, %ebx           Intel格式: mov ebx, eax3. 常数/立即数的格式 AT&T格式: movl $_value, %ebx        Intel格式: mov eax, _valueCPU内部产生的数称为立即数,在汇编程序中立即数前面加"$" 美元符号movl $1, %eaxCPU内部产生一个数字1, 然后传送到eax寄存器中。mov后边的l表示long,说明是32位的传送指令。movl $4, %ebx与上条指令类似,生成一个立即数4,传送到ebx寄存器中。4. 把value的地址放入eax寄存器AT&T格式: movl $0xd00d, %ebx        Intel格式: mov ebx, 0xd00d5. 操作数长度标识 AT&T格式: movw %ax, %bx             Intel格式: mov bx, ax6. 寻址方式 AT&T格式:   immed32(basepointer, indexpointer, indexscale)Intel格式:  [basepointer + indexpointer × indexscale + imm32)7. 变量AT&T:  foo                         Intel: [foo]boo是一个全局变量。注意加上$是表示地址引用,不加是表示值引用。对于局部变量,可以通过堆栈指针引用。8.中断 系统调用movl $1, %eax     // 成一个立即数1,传送到eax寄存器中。// eax寄存器的值是系统调用号,1表示_exit系统调用movl $4, %ebx     // 生成一个立即数4,传送到ebx寄存器中。// ebx的值则是传给_exit系统调用的参数,还可以有ecx、edx做参数,也就是退出状态。int $0x80      // interupt // int指令称为软中断指令, CPU从用户模式切换到特权模式,然后跳转到内核代码中执行异常处理程序// int指令中的立即数0x80是一个参数,在linux内核中,int $0x80这种异常称系统调用(System Call)。// 一般在调用结束后CPU再切换回用户模式,继续执行int指令后面的指令,在用户程序看来就像函数的调用和返回一样.// _exit这个系统调用会终止掉当前进程,而不会返回它继续执行.

2.x86的寄存器

2.1 x86的通用寄存器有eax、ebx、ecx、edx、edi、esi。

这些寄存器在大多数指令中是可以任意使用的。
但有些指令限制只能用其中某些寄存器做某种用途,
例如除法指令idivl规定被除数在eax寄存器中,
edx寄存器必须是0,而除数可以是任何寄存器中。
计算结果的商数保存在eax寄存器中(覆盖被除数),
余数保存在edx寄存器。

2.2 x86的特殊寄存器有ebp、esp、eip、eflags。

eip是程序计数器。
eflags保存计算过程中产生的标志位,
包括进位、溢出、零、负数四个标志位,
在x86的文档中这几个标志位分别称为CF、OF、ZF、SF。
ebp和esp用于维护函数调用的栈帧。esp为栈指针,用于指向栈的栈顶(下一个压入栈的活动记录的顶部),
而ebp为帧指针,指向当前活动记录的底部。
每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。
寄存器ebp指向当前的栈帧的底部(高地址),
寄存器esp指向当前的栈帧的顶部(低地址)。注意:ebp指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。
严格说来,“栈帧底部”和“栈底”是不同的概念;
esp所指的栈帧顶部和系统栈的顶部是同一个位置。

3. GCC基本内联汇编

GCC 提供了两内内联汇编语句(inline asm statements):基本内联汇编语句(basic inline asm statement) 和扩展内联汇编语句(extended inline asm statement)。GCC基本内联汇编很简单,一般是按照下面的格式:asm("statements");例如:asm("nop"); asm("cli");"asm" 和 "__asm__" 的含义是完全一样的。如果有多行汇编,则每一行都要加上 "\n\t"。其中的 “\n” 是换行符,"\t” 是 tab 符,在每条命令的 结束加这两个符号,是为了让 gcc 把内联汇编代码翻译成一般的汇编代码时能够保证换行和留有一定的空格。本asm语句,GCC编译出来的汇编代码就是双引号里的内容。例如:
          asm( "pushl %eax\n\t""movl $0,%eax\n\t""popl %eax");asm("movl %eax, %ebx");asm("xorl %ebx, %edx");asm("movl $0, _boo);
在上面的例子中,由于我们在内联汇编中改变了 edx 和 ebx 的值,
但是由于 gcc 的特殊的处理方法,即先形成汇编文件,
再交给 GAS 去汇编,所以 GAS 并不知道我们已经改变了 edx和 ebx 的值,
如果程序的上下文需要 edx 或 ebx 作其他内存单元或变量的暂存,
就会产生没有预料的多次赋值,引起严重的后果。
对于变量 _boo也存在一样的问题。
为了解决这个问题,就要用到扩展 GCC 内联汇编语法。

4. GCC扩展内联汇编


http://www.ppmy.cn/news/1112951.html

相关文章

AMD 5600G + 华硕A520M 引起的 Windows与Linux双系统冲突问题

上两周用了十年的i3技嘉主板的台式电脑进系统花屏,无法使用。机器用了这么久,我也懒得研究是是什么问题导致的,直接在网上买了一堆新的配件进行组装,具体的配置如下: 金百达DDR4 银爵 16G 3200 DDR4 长鑫颗粒&#xff…

2023面试知识点一

1、新生代和老年代的比例 默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) 1/3 的堆空间大小。老年代 ( Old ) 2/3 的堆空间大小。其中,新生代 ( …

【毕设选题】opencv 图像识别 指纹识别 - python

文章目录 0 前言1 课题背景2 效果展示3 具体实现3.1 图像对比过滤3.2 图像二值化3.3 图像侵蚀细化3.4 图像增强3.5 特征点检测 4 OpenCV5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往…

用思维导图了解《骆驼祥子》的内容

《骆驼祥子》是一部经典的中国小说,由著名作家老舍所创作。小说以北京城下贫苦的人们为背景,讲述了一个叫做祥子的年轻人,为了摆脱贫困和苦难,不断地奋斗和努力的故事。下面我们进行文字思维导图的方式来一起了解一下整个故事的内…

什么是 Microsoft Office 365? Excel on Cloud 的好处

什么是Office 365 Office 365 是 Microsoft 的一套程序,可以在本地运行,也可以同步到云存储。 可以从访问程序。 借助 Office 365,您可以在任何地方进行工作,并与世界各地的同事共享工作文档。 Office 365 支持的设备&#xff1a…

Postman应用——下载注册和登录

文章目录 下载安装注册登录注册账号登录账号 下载安装 Postman下载:https://www.postman.com/ 访问链接后,进入首页,根据自己的操作系统下载对应的版本。 找到下载到的目录直接双击.exe文件,会默认安装在C盘,安装完会…

动态规划:子序列问题(C++)

动态规划:子序列问题 前言子序列问题1.最长递增子序列(中等)2.摆动序列(中等)3.最长递增子序列的个数(中等)4.最长数对链(中等)5.最长定差子序列(中等&#x…

python学习随笔3

range的使用 range()在python很常用&#xff0c;可以进行初始化和遍历等。 # range(st,ed) # [st, ed)# range(st,ed,step) # range(st, ed, step) i,i step, i 2 * step ... () < ed切片 跟range类似。 ll[st:ed:step]容器 元组 python中的元组中内容不可以进行更…