
汇编
文章平均质量分 57
桀溺。
这个作者很懒,什么都没留下…
展开
-
AT&T语法
在linux内核编写中, 为了维持与gcc输出汇编程序的兼容性, as汇编器使用AT&T系统的V的汇编语法(下面简称为AT&T语法). 这种语法与Intel汇编程序使用的语法(简称Intel语法)很不一样, 他们之间的主要区别有以下几点:AT&T语法中立即操作数前面要加一个字符"$";寄存器操作数名前要加字符百分号"%", 绝对跳转/调用(相对于与程序计数器有关的跳转/调用)操作数前面要加"*". 而Intel汇编语法没有这些限制AT$T语法与Intel语法使用的源和目的操作数原创 2021-10-21 22:24:45 · 952 阅读 · 0 评论 -
CPU原生支持的任务切换方式
CPU 厂商原本计划的一种任务切换方法,并不是咱们项目中任务切换的方法, 未采用的原因是此方法效率不高,现代操作系统很少用这种方法切换任务为了支持多任务, CPU 厂商提供了 LDT TSS 这两种原生支持,他们要求为每个任务分别配一个 LDT TSS (这由咱们操作系统程序员来构建), LDT 中保存的是任务自己的实体资源,也就是数据和代码,TSS 中保存的是任务的上下文状态及三种特权级的栈指针、 I/O 位图等信息。既然 LDT TSS 用来表示任务,那么任务切换就是换这两个结构:将新任务对应的 LD原创 2020-11-27 22:28:14 · 651 阅读 · 3 评论 -
实现线程的两种方式
起初,操作系统中只有进程的概念,人们那时候对并发没有太高的要求。后来有些人想提高程序的井发,这才有了线程这一新生事物。任何新生事物在诞生之初都会被小心谨慎地对待,人们提出线程的需求时,操作系统也抱着“围观”的心态不敢轻举妄动,只能坐看其发展,真正待需求明朗时才会在操作系统一级来实现。想想也是,如果稍微有个新需求就往内核里面塞,内核开发成本很高不说,至少内核中肯定有很多“不切实际”的功能,所以人们还是能够体谅操作系统研发厂商的.为此,既然不能说服操作系统支持线程,人们只好在用户进程内想办法。所以,线程的实现原创 2020-11-17 13:45:48 · 1012 阅读 · 0 评论 -
门描述符
门,顾名思义,是通往某处的入口。在计算机中,用门来表示一段程序的入口。拿它和段描述符对比一下就容易理解了,段描述符中描述的是一片内存区域,而门描述符中描述的是一段代码。 门描述符中的各属性位与段描述符中的属性意义相同,大伙可以参考全局描述符表部分的介绍。下面简要说下这几种门描述符,这里咱们只讨论 32 位保护模式。任务门任务门和任务状态段TSS是 Intel 处理器在硬件一级提供的任务切换机制,所以任务门需要和 TSS 配合在一起使用,在任务门中记录的是 TSS 选择子,偏移量未使用。原创 2020-11-04 12:24:22 · 1092 阅读 · 0 评论 -
进入保护模式
设置全局描述符表打开A20地址线在实模式采用段基址:段内偏移地址的形式, 有20根地址线,最大寻址空间1MB, 但这种寻址方式可以寻址范围0x0000: 0x0000 ~ 0xffff: 0xffff, 即0 ~ 0x10ffef, 而20位地址线的访问空间是0 ~ 0xfffff, 即1MB范围, 所以当寄存器的表示范围超过地址线所能表示的范围后, 会发生地址会绕, 即或舍弃高位的溢出, 比如, 0x10000寻址到0x0000所表示的内存地址.CPU发展到了80286后, 虽然地址总线从原来的2.原创 2020-09-29 22:58:49 · 268 阅读 · 0 评论 -
全局描述符表
首先,实模式下存在一些问题:实模式的用户程序可以破坏存储代码的内存区域,所以要添加个内存段类型属性来阻止这种行为实模式下的用户程序和操作系统是同一级别的,所以要添加个特权级属性来区分用户程序和操作系统的地位其次, 是一些访问内存段的必要属性条件内存段是一片内存区域,访问内存就要提供段基址,所以要有段基址属性为了限制程序访问内存地范围,还要对大小进行约束,所以要有段界限属性...原创 2020-09-25 13:15:02 · 1449 阅读 · 0 评论 -
C语言内联汇编
开门见山,汇编语言和C语言混合编程可分为两大类:单独的汇编代码文件与单独的C语言分别编译成目标文件后,一起链接成可执性文件在C语言中嵌入汇编代码,直接编译生成可执行程序今天主要介绍第二种内联汇编称为inline assembly, GCC支持在C代码中直接嵌入汇编代码,所以称为GCC inline assembly.内联汇编按格式分为两大类,一类是最简单的基本内联汇编,另一类是复杂一些的扩展内联汇编.(内联汇编中所用的汇编语言是AT&T,并不是咋们熟悉的Intel语法,GCC只支持它,原创 2020-09-06 12:31:56 · 404 阅读 · 0 评论 -
8086处理器的寻址方式
处理器的一生,是忙碌的一生,只要它工作着,就必定是在取指令和执行指令.所以,如果你问处理器整天忙什么,它一定会说:“还能有什么,就是和数打交道!”既然操作和处理的是数值,那么,必定涉及数值从哪里来,处理后送到哪里去,这就称为寻址方式. 简单地说,寻址方式就是如何找到要操作的数据,以及如何找到存放操作结果的地方.寄存器寻址指令执行时,操作的数位于寄存器中,可以从寄存器中取得mov ax cx ;l两个操作数都是寄存器寻址add ax, 0xf000 ;目的操作数是原创 2020-07-27 16:06:30 · 763 阅读 · 0 评论 -
汇编之一个C程序的执行过程
一个C过程的大致结构如下:1. 准备阶段形成帧底:push指令和move指令生成栈帧(如果需要的话):sub指令或and指令保存现场(如果有被调用者保存寄存器):mov指令2. 过程(函数)体:分配局部空间,并赋值具体处理逻辑,如果遇到函数调用准备参数:将实参送到栈帧入口参数处CALL指令:保存返回地址并转调用函数在EAX中准备返回参数3. 结束阶段:退栈...原创 2019-11-02 18:21:08 · 436 阅读 · 1 评论