汇编
lindorx
头疼
展开
-
x86CPU中TSS
TSS为intel为了方便操作系统管理进程而加入的一种结构,用法也很简单。TSS是一个段,即一块内存,这里保存要切换的进程的cpu信息,包括各种寄存器的值、局部描述表ldt的段选择子等,切换时cpu会将这段内容存进各自对应的寄存器,然后就完成了切换。(任务切换或者说CPU状态更新实质上就是改变各个寄存器的值)//32位TSS段结构struct TSS32{ int backlin...原创 2020-04-08 00:39:03 · 1301 阅读 · 0 评论 -
在C语言中如何访问堆栈
堆栈一般是用来保存变量之类的东西(静态变量在内存中,虽然堆栈就是内存的一部分,但为了防止歧义,还是分成两部分来说),一般情况下没必要去故意读取堆栈的值,变量用变量名就可以直接访问,但我曾经想要读取函数返回后代码继续执行的地址,因此想到了来读取堆栈(函数调用时,会向堆栈中压入参数和下一个代码执行的地址,这样就可以在函数返回后继续执行)。先来测试一下我们能否读取堆栈(或者说数组越界访问会怎么样):...原创 2019-07-12 10:01:29 · 2955 阅读 · 2 评论 -
GDT表
gdt表在x86架构中用来存储内存的分段信息,通过段选择子进行访问,表的大小=0x10000=65536字节,每个表项占8字节,第一个表项为空,不使用,因此一共有8191个可用表项。表项结构如下(图片来自https://blog.csdn.net/yeruby/article/details/39718119)其中段限长决定了这个段的大小,总共占用20bit,最小单位由G位决定,...原创 2019-04-20 00:35:47 · 9845 阅读 · 0 评论 -
实模式下字符的显示及中断
参考书籍《0x86从实模式到保护模式》1.实模式显示字符首先,电脑开机进入系统,加载bios,然后bios完成一些硬件的初始化,从磁盘读取mbr到绝对地址0x7c00处,然后跳转至0x7c00,此时屏幕的显示模式默认为80*25(一行80个字符,共25行)。如何对屏幕输出字符?很简单,这个模式的缓冲区地址为0xb8000(0xb8000-0xb8f9f),屏幕上一个字符的这里占两个字节...原创 2018-11-11 15:39:00 · 2522 阅读 · 0 评论 -
对于KolibriOS系统引导部分的详细解读
1.首先大概说一下KolibriOS这个系统引导的过程,然后是对其bootloder.asm文件的注释分析引导程序被加载到0x7c00后,首先向屏幕输出“Starting system”字样,然后从fat12结构中获取需要的信息,将位于软盘镜像的根目录表(第20-第33扇区)加载至0x700处,之后寻找字符串为"KERNEL MNT"的表项(KERNEL.MNT为内核文件),找到后根据该表项...原创 2018-10-07 10:42:06 · 2004 阅读 · 0 评论 -
从软盘复制数据到内存
本文阐述在计算机引导程序中可以用来复制内核代码的程序,平台:centos,语言:AT&T格式的x86汇编,虚拟机:bochs,编译器:gcc。设定内核代码紧跟在512字节的boot程序后面利用bios复制程序:movw $0x9000,%ax //将要写入的位置的段地址存入esmovw %ax,%es //由于没有直接将操作数存入es的指令,所以需要通过ax中转mov...原创 2018-09-09 02:33:49 · 537 阅读 · 0 评论 -
MIT 6.828课程引导部分的解读
引导代码位于boot文件夹下,由一个16位与32位汇编混合的汇编文件(boot.S)和一个C语言文件(main.c)组成。程序的入口在boot.S中,采用的是AT&T语法,下面先对这个文件进行分析:#include <inc/mmu.h>在inc文件夹下有一个mmu.h头文件,这里存放了一些经常会用到的宏定义.set PROT_MODE_CSEG, 0x8 ...原创 2018-06-05 15:44:23 · 1069 阅读 · 2 评论 -
linux文件操作(ATT汇编)
首先介绍一下linux的shell脚本写法,其实与windows下.bat文件的写法差不多,一行一行的写命令就行了,例如,当我们要用vim打开某个目录(/user/include/printf.h)下的文件,可以这样写:cd /usr/includevim printf.h保存为run.sh第一次运行shell脚本时,要先给这个脚本权限,假设脚本名称为“run.sh”,命令为“ch...原创 2018-05-14 21:27:11 · 1593 阅读 · 0 评论 -
linux-AT&T汇编,把32位寄存器的值以16进制字符串打印出来
将寄存器的值以16进制显示,程序如下:.section .bbs.lcomm buf,10 #定义一个10字节长度的内存区,用来储存计算出来的字符.section .text.globl _start_start://初始化寄存器movl $0x01abcdef,%eax #将需要转换的值存入eaxmovl $0,%edimovl $0x0000000f,%edx//写入‘0X...原创 2018-05-12 13:40:54 · 1758 阅读 · 0 评论 -
linux下的AT&T汇编——键盘输入输出,makefile文件的编写
注:1.linux的系统调用号在“/usr/include/asm/unistd.h”文件中,有32位和64位之分2.linux下函数参数是用寄存器进行传递的,因此同时最多只能传递6个参数。3.linux的软中断号为0x80,因此调用中断汇编指令为“int $0x80”(AT&T汇编)。4.这里涉及的功能号有三个,read为3,write为4,程序退出是1,要存入eax。5.要将需要的功能...原创 2018-05-09 22:32:49 · 970 阅读 · 2 评论 -
AT&;T 汇编基础
AT&T 汇编是一种和intel汇编在语法上完全不同的汇编语言,为避免混淆intel语法,本文只介绍AT&T汇编,以下是所有的寄存器,AT&T的第一个特点就是每个寄存器名前必须加‘%’,立即数前必须加‘$’:(下面省略了%)8个32位寄存器:eax, ecx,edx, ebx, esp,ebp, esi, edi8个16位寄存器:ax, cx,dx, b...原创 2018-05-01 18:35:19 · 1977 阅读 · 0 评论