随笔分类 - Assemble
摘要:1 输入参数传递数组或地址测试代码: 1 #include <stdio.h> 2 3 void foo(char *a) 4 { 5 fprintf(stdout, "%x %x %x\n", &a, a, a[0]); 6 } 7 8 int main ( int argc, char *argv[] ) 9 {10 char a[20] = {'a', 'b', 'c'};11 12 fprintf(stdout, "%x %x %x\n", &a, a, a[0]);13
阅读全文
摘要:1 程序的地址空间布局 一个程序在内存中运行,它靠四个东西:代码、栈、堆、数据段。代码段主要存放的就是可执行文件中的代码;数据段存放的就是程序中全局变量和静态变量;堆中是程序的动态内存区域,当程序使用malloc或new得到的内存是来自堆的;栈中维护的是函数调用的上下文,离开了栈就不可能实现函数的调用。在linux中它们的地址空间分布如下: 其中最让我迷惑的还是栈,它是怎么保存程序执行的上下文的?我对它的理解还是保留在数据结构学的栈,什么先进先出,只对栈顶进行操作,对于它的具体应用还真是不太了解。以前写代码就很好奇,当调用一个程序时,栈中到底保留了些什么东西?今天终于有了点理解。2 堆栈帧..
阅读全文
摘要:在实现引导加载器之前,首先我们先了解下在开机之后系统是怎么被引导的,这对于实现引导加载器来说是很重要的。只有知道原理,才能更好的实现嘛。 1 引导过程 1.1 当电源按钮按下时 当我们按下电源按钮是到底发生了什么?当这个按钮被按下后,连接到这个按钮的线缆会向主板发送一个电信号,主板简单的把这个信号转
阅读全文
摘要:1 安装和配置bochs 首先从bochs.sourceforge.net里面把BOCHS给download下来,鉴于Windows的普及,仅仅谈BOCHS在win下的使用方法,其实在其它的OS中方法差不多,不过我仅仅在Window和Linux下安装使用过。 在bochs.sourceforge.net里面把Bochs-2.6.1.exe给download下来,双击就开始安装。这软件不大,安装完才4兆多,当然,这是标准安装,如果你选择的是完全安装,则比标准安装多个DLX linux demo这个OS,如果你是第一次使用BOCHS,建议你用完全安装,装完 ,现不用着急学会BOCHS的一大堆配..
阅读全文
摘要:1 输入debug命令 在win7的命令行中输入debug,就进入到虚拟8086的执行环境了。也可以输入debug + 程序名字,这就是对某个程序进行调试。2 r(register)命令 从名字可以看出是对寄存器操作的命令,此指令有两个功能:一是显示所以寄存器和标记的内容,二是修改寄存器的内容。只输入r来显示寄存器的内容: debug总共显示3行,最底下一行是debug正要执行的命令,即cs:ip指向的命令。第一行和第二行显示了各个寄存器的值,其中第二行的最后表示的是标志寄存器中的值,从左到右分别为:溢出标志:ov(溢出),nv(未溢出);方向标志:dn(减),up(曾);中断标志:ei...
阅读全文
摘要:80386处理器有3种工作模式:实模式、保护模式和虚拟86模式。实模式和虚拟86模式是为了和8086处理器兼容而设置的。在实模式 下,80386处理器就相当于一个快速的8086处理器。保护模式是80386处理器的主要工作模式。在此方式下,80386可以寻址4GB的地址空间,同时,保护模式提供了80386先进的多任务、内存分页管理和优先级保护等机制。为了在保护模式下继续提供和8086处理器的兼 容,80386又设计了一种虚拟86模式,以便可以在保护模式的多任务条件下,有的任务运行32位程序,有的任务运行MS-DOS程序。在虚拟86模式 下,同样支持任务切换、内存分页管理和优先级,但内存的寻址..
阅读全文
摘要:对于一个程序员来说,调试是很重要的,可以节约找到bug的时间,不过以前在linux下一直是对c进行调试的,今天突然要对汇编进行调试还真不知道怎么调,特别是对linux下调试汇编程序基本没搞过。记得以前上课学masm时,用的是debug,貌似映像中对汇编挺难调试的。于是就在网上查了下在linux下调试nasm汇编程序的资料,看起来比debug简单点。1 写和编译源文件 首先准备个hello.asm文件,这个学语言必编的程序,代码如下: section .datamsg: db "hello, world", 10len equ $-msg section .text ...
阅读全文
摘要:今天看了于渊的《自己动手写操作系统》中的第一章,怎样10分钟写个操作系统,这个操作系统其实就是一个启动程序。 当计算机电源被打开后,它会先进行加电自检(POST),然后寻找启动盘,如果是选择从软盘启动,计算机就会查找软盘的0面0磁道1扇区,如果发现它以0xAA55结束,则BIOS认为它是一个引导扇区,然后BIOS就会把引导扇区的前512字节的引导代码拷贝到内存的0000:7c00处并将控制器彻底交给这段引导代码。 简单的引导代码如下所示: 1 org 07c00h ;告诉编译器加载到07c00h处 2 3 mov ax, cs 4 mov ds, a...
阅读全文