- 博客(31)
- 收藏
- 关注
原创 IF,TF,NT
IFIF 位只能限制外部设备的中断,对那些影响系统正常运行的中断都无效,如异常 exception,软中断,如 int n 等,不可屏蔽中断 NMI 都不受 IF 限制.sti 和 cliIF 可以直接控制。指令cli 使 IF 位为 0,这称为关中断,指令 sti 使 IF 位为 1,这称为开中断。TFTF 表示 Trap Flag,也就是陷阱标志位,这用在调试环境中,当TF 为 0 时表示禁止单步执行,也就是说,进入中断后将 TF 置为 0,表示不允许中断处理程序单步执行NTNT 位表示
2022-01-20 16:08:53
1692
原创 处理器内部中断特权级检查
处理器内部进行特权级检查。由于中断是通过中断向量号通知到处理器的,中断向量号只是个整数,其中并没有 RPL,所以在对由中断引起的特权级转移做特权级检查中,并不涉及到 RPL。中断门的特权检查同调用门类似,**对于软件主动发起的软中断,当前特权级 CPL 必须在门描述符 DPL 和门中目标代码段 DPL 之间。**这是为了防止位于3 特权级下的用户程序主动调用某些只为内核服务的例程。(a) 如果是由软中断 int n、int3 和 into 引发的中断,这些是用户进程中主动发起的中断,由用户代码控制,
2022-01-20 15:49:41
476
原创 AT&T寻址
格式segreg(段基址):base_address(offset_address,index,size)该格式对应的表达式为:segreg(段基址):base_address+ offset_address+ index*size总结:任意一种内存寻址方式,其格式都是这个通用格式的子集,都是格式中各种成员的组合成员项介绍base_address 是基地址,可以为整数、变量名,可正可负。offset_address 是偏移地址,index 是索引值,这两个必须是那 8 个通用寄存器之一。si
2022-01-19 18:03:57
574
原创 put_char
光标的位置CRT Controller Data Registers中索引为 0Eh 的 Cursor Location High Register 寄存器和索引为 0Fh 的 Cursor Location Low Register 寄存器,这两个寄存器都是 8 位长度,分别用来存储光标坐标的低 8 位和高 8 位地址。访问 CRT controller 寄存器组的寄存器,需要先往端口地址为 0x3D4 的 Address Register 寄存器中写入寄存器的索引,再从端口地址为 0x3D5 的 D
2022-01-19 00:20:57
105
原创 pushad
PUSHADPUSHAD 是 push all double,该指令压入所有双字长的寄存器,这里的“所有”一共是 8 个,它们的入栈先后顺序是:EAX->ECX->EDX->EBX-> ESP-> EBP->ESI->EDI,EAX 是最先入栈。
2022-01-18 21:30:01
320
原创 write函数
cdecl(1)调用者将所有参数从右向左入栈。(2)调用者清理参数所占的栈空间。当输入的参数小于等于5个时传入参数的顺序:1.ebx存储第一个参数2.ecx存储第二个参数3.edx存储第三个参数4.esi存储第四个参数5.edi存储第五个参数global _start_start: ;模拟c语言中系统调用库函数write ;方式1 push str_c_lib_len push str_c_lib push 1 call simu_wri
2022-01-17 22:37:33
564
原创 汇编语言push总结
push压入立即数在实模式环境下:当压入8位立即数时,由于实模式下默认操作数是16位,cpu会将其扩展为16位后再将其入栈,sp-2当压入16位立即数时,cpu会将其直接入栈sp-2当压入32位立即数时,cpu会将其直接入栈sp-4,编译器编译完成后的机器码会加操作数反转前缀0x66再保护模式下:当压入8位立即数时,由于保护模式下默认操作数是32位,cpu将其扩展为32位后入栈,扩展相当于是编译器的强制类型转换。esp-4当压入16位立即数,cpu直接压入2字节,esp-2 , 这个编译出
2022-01-12 14:49:55
6206
1
原创 《x86汇编语言:从实模式到保护模式》读书笔记
《x86汇编语言:从实模式到保护模式》读书笔记1.低端字节序列:高字节位于高地址部分,低字节位于低地址部分。2.将一个16位的寄存器当成8位的寄存器来用时,对其中一个8位寄存器的操作不会影响到另一个8位寄存器。也就是说,当你操作寄存器al时,不会影响到ah中的内容。3.nasm -f bin exam.asm -o exam.bin-f bin就是要求nasm生产的文件只包含“纯二进制”的内容。这样一来,因为缺少操作系统所需要的加载和冲定位信息,他很难在windows,dos,linux上作为一
2021-11-30 00:34:54
707
原创 二进制文件格式
一.引子相信很多人都知道编译一个c或者一个c++程序的时候都知道要经过预处理,编译,汇编,链接这四步操作。大家都知道printf这个函数在stdio.h 这个头文件里,原来我在window系统里面的devc++看过printf的实现,但是当我在linux系统里面打开stdio.h的时候并没有看到函数的定义,有的只是函数的声明,这大大激发了我对知识的渴望。后来我知道了printf这个函数是动态链接过来的。我们来看一下这段代码。 1 #include <stdio.h> 2
2021-09-05 17:04:03
2176
1
原创 C++函数学习笔记
函数声明如果一个函数永远不会被我们用到,那么他可以只有声明没有定义.在头文件中进行函数声明1.函数应该在头文件中声明而在源文件中定义.2.如果吧函数声明放在头文件中,就能确保同一函数的所有声明保持一致,而且一旦我们想改变函数的接口,之需要改变一条声明即可.3.定义函数的源文件应该把函数声明的头文件包含进来,编译器负责检验函数的定义和声明是否匹配.引用传递和值传递引用传递当形参是引用类型的时候,我们就说他对应的实参是引用传递或者函数被引用调用.值传递当实参的值被拷贝给形参时,我们就说实参
2021-07-27 17:57:31
193
原创 c++表达式学习笔记
##vecter赋值运算符对于类来说,赋值运算的细节由类本身决定,对于vector来说,vector模块重载了赋值运算符号并且可以接受初始值列表vector<int> vi; //我们是没有初始化的vi = {0,1,2,3,4,5,6,7,8,9}; //vi现在含有10个元素无论左侧运算对象的类型是什么,初始化列表都可以为空,此时,编译器创建一个值初始化的临时量并将其赋值给左侧运算对象##赋值运算满足右结合律int ival, jval;ival
2021-07-26 15:50:05
80
原创 c语言语法规范
c语言语法规范1.#include后面要先加空格#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>2.指针后面的*号要跟在变量名后面 aeEventLoop *el; const char *hostip; const char *hostsocket;3.结构体的括号typedef struct benchmarkThread {
2021-07-19 22:32:17
2250
原创 my_shell实现
下面是我根据书上的my_shell实现的my_shell.涉及到一下关于进程的知识,下面我将介绍一下.代码部分#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/wait.h>#include<sys/types.h>#include<fcntl.h>#include<sys/stat.
2021-05-07 19:36:53
343
原创 《python 程序设计》读书笔记
《python 程序设计》读书笔记第一章:概述1.为了编写计算机程序,需要向cpu提供一系列能够执行的命令,因为一条一条的命令容易出错,所以发明了高级编程语言, 这些语言允许程序员在高层指定一些程序任务,然后高级指令会被转换为cpu所需要的更详细的指令.2.python程序由python解释器负责解释和执行3.python的交互式环境,可以在终端里面输入python3命令,>>>这个是提示符,表示可以输入python的命令>>>4.python解释器,pyt
2021-04-01 18:23:37
4389
7
原创 抛开下标运算的表面,深入的去探讨下标运算的本质
我讲这个的目的就是让大家能够对运算符的优先级和结合性有更深刻的认识,还有大家能够对下标运算有更深刻理解。这是我给大家讲这个的目的。 1 #include<stdio.h> 2 #include<stdlib.h>
2021-02-10 22:36:33
135
原创 gdb工具使用详细解析
gdb 使用方法详细解析要调试的文件一定要是一个可执行的文件gdb调试一个程序的命令格式是:gdb 程序文件名,但是这样会出现一个版权说明如果不想要版权说明,那么 gdb -q 然后file 文件名结束调试:quit显示和查找程序源代码list命令用于列出程序的源代码list 显示10行代码,如果再次运行该命令,就会显示接下来的10行代码list 5,10 显示第五行到第十行代码list text.c:5,10 显示源文件中的5到10行代码,再调试多个源文件的时候会使用list g
2021-01-21 12:27:31
561
原创 typedef讲解
typedef讲解可以吃用typedef声明新类型名来替代已有的类型名例子:typedef int INT;//注意这个是要加分号的1.int i,j,k; int 和INT 是等价的INT i,j,k;2.结构体例子typedef struct{int year;int month;int day;}DATE;声明新的结构体类型为DATE,使用DATE来定义变量DATE birthday;这个时候这个birthday 就是新的变量,不同的是如果不实用typedef的化,那么DA
2021-01-20 16:58:52
759
原创 位运算
位运算位操作符号& 按位与运算符规则:按二进制位进行与运算,相应的两个二进制位如果都为1则该位的运算结果都是1,否则为0i&j=10&7=2 这个会转换成二进制代码,然后一位一位的进行比较,然后最后计算出结果| 按位或运算符规则:按二进制位进行或运算.相应的两个二进制位只要有一个为1,则该位的运算结果就为1i|j=10|7=15^ 按位异或运算符规则:按二进制位进行异或运算,规则是:相应的两个二进制位如果相同则该位的运算结果就为0,否则就是1ij=107=13
2021-01-20 16:57:23
79
原创 结构体讲解
结构体结构体的一般形式为:struct 结构体名:用来标识(zhì)一个结构体{成员列表:成员可以是任何c语言的数据类型}; 注意:这里一定要写分号:因为声明结构体也是一个c语言语句声明了一个结构体,相当于构造了一种新的数据类型,此时系统并不为它分配内存空间,只有定义力结构体类型的变量,系统才为该变量分配内存空间,声明了结构体后,就可以定义结构体类型的变量,定义的一般形式为:结构体名 变量名;例如:struct person p1,p2;这个是以person为数据类型,定义了两个变量p1
2021-01-20 16:56:17
2884
原创 宏定义
宏定义预处理命令:预处理命令是在编译源程序钱先对源程序进行处理,预处理完成后,编译器开始编译源程序生产可执行代码,因为预处理指令不是c语言的一部分,所以每条编译预处理命令不需要以分号结束宏定义:宏:c语言标准允许在程序中用一个标识符来表示一个字符串,标识符称为宏名,在编译预处理时,将程序中所有的宏名用相应的字符来替换,这个过程称为宏替换无参数的宏#define 标识符 字符串 #表示这是个预处理命令define是宏定义的关键字,标识符是宏名,字符串是宏名所替换的内容,可以是常数,表达式宏替换是在程
2021-01-20 16:54:56
1088
原创 共同体
共同体共用体把几种不同数据类型的变量存放在同一块内存中,共同体中的变量共享同一块内存定义共同用类型变量的一般形式:union 共用体名{成员列表}变量列表;例子:union data{int i;char c;double d;};union data a;a.i = 100;a.c= ‘A’;他们是从内存中同一个地址开始存储的,这个时候a中的成员i已经没有值了,因为存储值的内存现在被用来存储成员c了,共同用体变量中起作用的成员是最后一次存入的数据长度取决于其成员的
2021-01-20 16:53:02
518
原创 win10更新双系统启动选项消失得解决方案
关于win10更新双系统启动选项消失的解决方法进入电脑的bios界面,然后找到delete boot option,删除win10的引导,然后就只剩下一个引导,那个引导就是win10加另外一个习题的引导.如果怕出错的化,那也可以进入那个双系统的引导,看能不能进入win10系统.我自己亲身测试,比网上什么取消安全模式要有用得多,如果觉得对你有用,可以关注我一手,我以后会更新一些编程还有一些问题解决得方法....
2021-01-18 11:23:05
3899
原创 力扣两数想加
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; *///初始化头和尾(yǐ)巴struct ListNode*head=NULL;struct ListNode*end=NULL;//定义一个增加节点的函数void addlist(int a){ struct ListNode*ptemp=(struct
2020-12-19 11:20:04
94
2
原创 桶排序详细解读
//桶排序,记录分数,0到10分,我们输入5个成绩,对这个成绩进行排序#include<stdio.h>#include<stdlib.h>bint main(void){int a[11],i,j,t;//我们用下标来记录分数,这里最多10分,所以是11for( i=0;i<=10;i++)a[i]=0;//其实这里没有必要这样写 a[11]={0};其他的也默认初始化为0for( i=0;i<5;i++){scanf("%d",&t);
2020-12-17 00:36:50
199
原创 快速排序以及我个人的理解
#include<stdio.h>int a[101],n;//定义两个全局变量这,两个都要在全局范围内使用void quicksort(int ,int );void quicksort(int left,int right){//i,j作为哨兵,temp是基准数int i,j,temp,t;//考虑传递过来的参数出错的情况if(left<right)return ;//传递过来的阐述正确的情况temp=a[left];//注意:这里的left初始的是1,而且我
2020-12-17 00:34:37
51
原创 快速选择排序
#include<stdio.h>#include<stdlib.h>int main(void){int n;int k;scanf("%d%d",&n,&k);int b[n];for(int i=0;i<n;i++){scanf("%d",&b[i]);}for(int i=0;i<k;i++){int m=i;for(int j=i+1;j<n;j++){if(b[m]>b[j]){int
2020-12-17 00:32:54
174
原创 堆排序
#include<stdio.h>#include<stdlib.h>void swap(int arr[], int i, int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}void heapify(int tree[], int n, int i) //i表示的是要对哪个节点做操作,n表示由多少个节点{if (i >= n) //出口return;int c1 = 2 * i + 1;i
2020-12-17 00:31:06
127
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人