
汇编
文章平均质量分 80
zhangxinrun_业余erlang
这个作者很懒,什么都没留下…
展开
-
mov和movl 的区别
<br />汇编语言(Assembly Language)中 mov和movl 有什么区别(举例说明) <br />In a word, they belong to two instruction set, movl is at%t and mov is intel <br />参考正确回答: <br />AT&T汇编语言(Assembly Language)是UNIX下惯用的汇编语言(Assembly Language)各式 <br />l,w,b是ATT汇编语言(Assembly Language)中转载 2010-08-12 17:49:00 · 31841 阅读 · 0 评论 -
80386在保护模式下的中断和异
中断和异常<br />学过8086/8088汇编的人肯定对于中断这个概念都不陌生。在80386中,这个概念在一定程度上发生了变化,并引入了“异常”这个新概念。本篇文章就是围绕在操作系统开发中涉及到中断和异常的讨论。中断<br />中断在系统中是由外部事件所引起的,如:一次I/O操作的结束。其产生与CPU当前所执行的指令没有关系。从是否能够被屏蔽来划分,可将其分为两类,即可屏蔽中断与不可屏蔽中断,其中前者由CPU的INTR引脚接收信号,后者由NMI引脚接收信号。<br />由于产生中断的中断源并不单一,因此在转载 2010-08-25 22:33:00 · 987 阅读 · 0 评论 -
优化屏障和内存屏障
<br />优化屏障和内存屏障 <br />优化屏障 <br />编译器编译源代码时,会将源代码进行优化,将源代码的指令进行重排序,以适合于CPU的并行执行。然而,内核同步必须避免指令重新排序,优化屏障(Optimization barrier)避免编译器的重排序优化操作,保证编译程序时在优化屏障之前的指令不会在优化屏障之后执行。<br />Linux用宏barrier实现优化屏障,gcc编译器的优化屏障宏定义列出如下(在include/linux/compiler-gcc.h中): <br />#defi转载 2010-08-27 14:48:00 · 2771 阅读 · 0 评论 -
linux内核--mb代码学习总结
<br />#define set_current_state(state_value) / <br />set_mb(current->state, (state_value)) <br /> <br />#define set_mb(var, value) do { var = value; mb(); } while (0) <br />#define mb() __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory")转载 2010-08-27 15:48:00 · 6202 阅读 · 0 评论 -
lock指令
<br />今天看源码发现了一条以前没关注的汇编指令lock,查了一篇日志,解释比较清除,转来参考。<br />以下为转载内容:<br />转载地址:http://ooooooo.blogbus.com/logs/1357939.html<br />今天看L4的代码,其中一个名为L4_KernelInterface的API让我迷惑了很久。其实现如下:<br />void * L4_KernelInterface(<br /> L4_Word_t *ApiVersion,<br />转载 2010-08-27 13:47:00 · 14457 阅读 · 1 评论 -
尝试总结memory barrier (经典)
<br />讨论完了给一个总结,有些话是别人说的,有的还是clf的网友的,为了不使文档显得杂乱,都不具名了。 <br />欢迎批评指正! <br /><br /><br />内核中定义的内存屏障原语有: <br /><br />#define barrier() __asm__ __volatile__("": : :"memory") <br />#define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2) <转载 2010-08-27 14:47:00 · 2456 阅读 · 0 评论 -
谈谈volatile变量
<br />在CLR 2.0 Memory Model中,我们知道现代CPU架构从CPU到Memory Controller每一级都有速度,容量不同的高速缓存。之所以这样设计,主要是因为性能。为了进一步提升性能,当线程读取内存中所期望的元素值时,CPU并不是只读取我们所期望的元素值,它实际上会同时读取该值周围的若干字节,并将其放入高速缓存中。这是因为应用程序通常读取的字节在内存中彼此相邻。当应用程序又读取该值周围的字节时,这些字节已经在高速缓存中了,这样就避免了应用程序再次访问内存,也提升了性能。 <br原创 2010-08-27 14:05:00 · 1052 阅读 · 0 评论 -
尝试总结memory barrier (经典)
<br />讨论完了给一个总结,有些话是别人说的,有的还是clf的网友的,为了不使文档显得杂乱,都不具名了。 <br />欢迎批评指正! <br /><br /><br />内核中定义的内存屏障原语有: <br /><br />#define barrier() __asm__ __volatile__("": : :"memory") <br />#define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2) <转载 2010-08-27 14:38:00 · 1191 阅读 · 0 评论 -
汇编语言的学习步骤
<br /> 1.首先,我不推荐《IBM汇编语言》这类教科书试的教材。一来里面讲的一些东西都过时了,只有一些8086的东东,可我们早使用奔腾了。从286,386之后,Inte CPU的结构已经有了很大的改进。而且这类书里面讲的也无非就是一些简单的指令格式和语法,但却讲得让人似在云里雾里。 <br /> <br /> 2.不推荐一开始就学MASM或TASM的语法,其实语法这东西很简单。只有有一点点计算机编程基础的人,我相信最多一个小时,都能基本搞懂,然后再练练就自然会熟,不记得直接翻Refererc转载 2010-09-15 22:05:00 · 2292 阅读 · 0 评论 -
结构体struct的自然对齐问题(经典)
结构体struct的自然对齐问题下面的机构体struct A{ char c; int i; char cc;};它的sizeof()是多少呢? 如果是紧凑对齐的话,当然是sizeof(char)+sizeof(int)+sizeof(char); 但编译器默认编译的却不是紧凑对齐的,在32-bit的机器上编译结果是12, 这是一个char占用了一个int的空间,换句话说,在c和i之间有三个空余的byte! 这就是自然对齐的效果。为什么要自然对齐呢?当初百度的gg电面我的时候,我胡乱的解释转载 2010-09-06 15:58:00 · 12254 阅读 · 7 评论 -
汇编中Enter和Leave指令
<br />Enter的作用相当==push ebp和mov ebp,esp<br />这后面两句大家很熟悉吧?函数开始一般都是这两句<br />Leave的作用相当==mov esp,ebp和pop ebp<br />而这后面这两句也很常见,函数调用完后一般的用到<br />以上的Enter和leave的作用分别函数开始和结束<br />Win32汇编中局部变量的使用方法可以解释一个很有趣的现象:在DOS汇编的时候,如果在子程序中的push指令和pop指令不配对,那么返回的时候ret指令从堆栈里得到的肯定转载 2010-09-16 15:01:00 · 19418 阅读 · 4 评论 -
and的作用和用法
<br />我知道And是逻辑与的意思,有的地方说他可以快速获取余数.比如第十章的reptest3.s中有这样一段代码;<br />cld <br />rep movsl<br />movl length, %ecx<br />andl $3, %ecx<br />解释是通过and操作快速获取余数.<br />而有的地方他也有其他的用法,比如老师曾说过的"对齐",但我不知道对齐的地方到底是那里,请老师帮我解决这个问题,可以告诉我and就有那些作用和用法,怎么用.<br />解答: <br /> <br />转载 2010-09-16 16:52:00 · 8054 阅读 · 0 评论 -
CPU总线的作用和分类
<br />按总线的功能(传递信息的内容)分类,计算机中有三种类型的总线,即传送数据信息的数据总线、传送地址信息的地址总线和传送各种控制信息的控制总线。 <br /><br />1.数据总线 <br />数据总线是CPU与存储器、CPU与I/O接口设备之间传送数据信息(各种指令数据信息)的总线,这些信号通过数据总线往返于CPU与存储器、CPU与I/O接口设备之间,因此,数据总线上的信息是双向传输的。 <br /><br />2.地址总线 <br />地址总线上传送的是CPU向存储器、I/O接口设备发出的地址转载 2010-09-18 21:44:00 · 11493 阅读 · 0 评论 -
网络设备操作系统(Linux .vs. vxWorks)
<br />2001年IBM大张旗鼓的宣布支持Linux,并投入10亿美金用于Linux相关开发。 <br />最近的Cisco抛弃了其专有的IOS核心,在 ASR1000的控制平面软件上采用了Linux为基础平台。据传Huawei、H3C等厂商的软件平台也纷纷转向以Linux为基础,而以前他们都采用vxWorks作为基础。几年前,就连vxWorks的开发者风河公司也宣布同时支持vxWorks和Linux。由此看来,Linux在网络设备领域取代vxWorks几乎已成定局。这背后的原因究竟是什么?与vxWor转载 2010-09-24 11:58:00 · 4181 阅读 · 1 评论 -
near指针,far指针,huge指针
<br />near指针和far指针<br />在DOS下(实模式)地址是分段的,每一段的长度为64K字节,刚好是16位(二进制的十六位)。<br />near指针的长度是16位的,所以可指向的地址范围是64K字节,通常说near指针的寻址范围是64K。<br />far指针的长度是32位,含有一个16位的基地址和16位的偏移量,将基地址乘以16后再与偏移量相加,(所以实际上far指针是20位的长度。)即可得到far指针的1M字节的偏移量。所以far指针的寻址范围是1M字节,超过了一个段64K的容量。例如一转载 2010-09-24 21:25:00 · 1357 阅读 · 0 评论 -
80386在保护模式下的中断和异
中断和异常<br />学过8086/8088汇编的人肯定对于中断这个概念都不陌生。在80386中,这个概念在一定程度上发生了变化,并引入了“异常”这个新概念。本篇文章就是围绕在操作系统开发中涉及到中断和异常的讨论。中断<br />中断在系统中是由外部事件所引起的,如:一次I/O操作的结束。其产生与CPU当前所执行的指令没有关系。从是否能够被屏蔽来划分,可将其分为两类,即可屏蔽中断与不可屏蔽中断,其中前者由CPU的INTR引脚接收信号,后者由NMI引脚接收信号。<br />由于产生中断的中断源并不单一,因此在转载 2010-08-25 22:30:00 · 978 阅读 · 0 评论 -
PE文件的基本结构-2 NT头
<br />1 PE文件头(NT文件头)<br />从DOS文件头的_lfanew字段(文件头偏移003ch)得到真正的PE文件头位置[$0000 0100]后,现在来看看它的定义,PE文件头是由IMAGE_NT_HEADERS结构定义的:<br />PImageNtHeaders = ^TImageNtHeaders;<br />_IMAGE_NT_HEADERS = packed record<br /> [$0100]Signature: DWORD;<br /> [$0104]FileH转载 2010-08-24 18:50:00 · 1287 阅读 · 0 评论 -
Linux 汇编语言开发指南
Linux 汇编语言开发指南<br />汇编语言的优点是速度快,可以直接对硬件进行操作,这对诸如图形处理等关键应用是非常重要的。Linux 是一个用 C 语言开发的操作系统,这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底层语言来优化程序的性能。本文为那些在Linux 平台上编写汇编代码的程序员提供指南,介绍 Linux 汇编语言的语法格式和开发工具,并辅以具体的例子讲述如何开发实用的Linux 汇编程序。<br />一、简介<br />作为最基本的编程语言之一,汇编语言虽然应用的范围不算转载 2010-08-13 15:08:00 · 1241 阅读 · 0 评论 -
GCC的内嵌汇编语法
AT&T ASM Syntax <br />1 Overview <br />开发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限制,使用精练的汇编可以缩小目标代码的Size。另外,对于某些需要被经常调用的代码,使用汇编来写可以提高性能。所以我们必须了解汇编语言,即使你有可能并不喜欢它。 <br /> <br />如果我们选择的OS开发工具是GCC以及GAS的话,就必须了解AT&T汇编语言语法,因为GCC/GAS只转载 2010-08-17 11:06:00 · 812 阅读 · 0 评论 -
skin++ 终极破解之法
<br />*[标题]:Skin++通用界面换肤系统V2.0.1破解探讨<br />*[作者]:gz1X <gz1x(at)tom(dot)com> <br />*[来自]:中国黑客联盟<br />*[前言]:<br />skin技术,大家都不会陌生,比如winamp,可以灵活的更换界面风格。早期的实现定制的外观方法都需要程序本身做许多处理,编码太麻烦。<br />后来出现了专门的Skin插件,ActiveSkin什么的。再后来dll调用的skin软件出现,需要Skin支持的程序调用几个方法,就可以使自己的转载 2010-08-21 23:08:00 · 1883 阅读 · 0 评论 -
窥探PE文件内幕:Win32 PE 文件格式之旅1
<br />Matt Pietrek <br />1994 年3月 <br />Matt Pietrek 是Windows Internals (Addison-Wesley, 1993)的作者。他就职于Nu-Mega 技术有限公司,可通过CompuServe: 71774,362联系到他。 <br />这篇文章出自1994年3月发行的Microsoft系统期刊。版权所有﹫1994 Miller Freeman, Inc.保留所有权利。未经Miller Freeman同意,这篇文章的任何部分不得以任何形式被转载 2010-08-23 21:58:00 · 1323 阅读 · 0 评论 -
PE文件的基本结构-1 总体介绍和dos头
<br />1 概论 <br />看历史;COM文件,EXE文件,LE格式的可执行文件(Linear executable/线性可执行文件),Windows 9x中的VxD驱动程序也使用LE格式,因为这些驱动程序中也同时包括16位和32位代码。<br />而在Windows 9x,Windows NT,Windows 2000下,纯32位的可执行文件都使用微软设计的一种新的文件格式——PE格式(Portable Executable File Format/可移植的执行体)。<br />PE文件的基本结构如转载 2010-08-24 18:49:00 · 1212 阅读 · 0 评论 -
PE文件的基本结构-4 导入表
<br />导入表的位置和大小可以从PE文件头中IMAGE_OPTIONAL_HEADER32结构的数据目录字段中获取,对应的项目是DataDirectory字段的第2个IMAGE_DATA_DIRECTORY结构,从结构的VirtualAddress字段得到导入表的RVA值。<br />导入表由一系列的IMAGE_IMPORT_DESCRIPTOR结构组成,结构的数量取决于程序要使用的DLL文件的数量,每个结构对应一个DLL文件,在所有这些结构的最后,由一个内容全为0的IMAGE_IMPORT_DESCR转载 2010-08-24 18:51:00 · 1049 阅读 · 1 评论 -
PE文件的基本结构-3 节表和RVA换算
<br />PE文件中所有节的属性都被定义在节表中,节表由一系列的IMAGE_SECTION_HEADER结构排列而成,每个结构用来描述一个节,结构的排列顺序和它们描述的节在文件中的排列顺序是一致的。全部有效结构的最后以一个空的IMAGE_SECTION_HEADER结构作为结束,所以节表中总的IMAGE_SECTION_HEADER结构数量等于节的数量加一。节表总是被存放在紧接在PE文件头的地方。<br />IMAGE_SECTION_HEADER结构的定义如下:<br />TISHMisc = pack转载 2010-08-24 18:51:00 · 1475 阅读 · 0 评论 -
中断过程简述
<br />一般来说,PC机有两种类型的中断: <br /> 1.软中断,也称内中断,是由执行某些指令引起的 <br /> 2.硬中断,也称外中断,是由外部接口设备引起的 <br /> 对于软中断,一般是由下列这4种情况引发的: <br /> 1):DIV或IDIV指令 <br /> 当执行这些除法指令,若除数为0或商溢出,则一定会产生中断,这叫0型中断 <br /> 2):INT指令 <br /> 当执行i转载 2010-08-25 20:34:00 · 6708 阅读 · 1 评论 -
Windows可执行文件简述(二)
<br />如果PSP中的第一个FCB含有一个有效驱动器标识符,则置AL为00h,否则为0FFh。MS-DOS还置AH为00h或0FFh,这依赖于第二个FCB是否含有一个有效驱动器标识符。<br /><br /> <br />建造PSP后,MS-DOS在PSP后立即开始(偏移100h)加载com文件,它置SS、DS和ES为PSP的段地址,接着创建一个堆栈。为了创建这个堆栈,MS-DOS置SP为0000h。如果没有分配64K内存,则要置寄存器为比所分配的字节总数大2的值。最后,它把0000h推进栈,这是为了保转载 2010-08-24 18:47:00 · 745 阅读 · 0 评论 -
Windows可执行文件简述(三)
4.LE格式<br />在Windows3.x的时代,从DOS启动Windows,Windows在把机器转到保护模式之前需要在实模式下做一些初始化。实模式的16位代码必须和32位代码一起放在可执行文件中。旧的DOS下的可执行文件和NE格式的可执行文件无法满足这个要求,于是从Win 3.x起到Win 9x,产生了一种新型的可执行文件格式LE,它只适用于工作于系统底层的、同时包含16位代码和32位代码的VxD驱动程序。OS/2 2.x也使用LE格式。<br /><br /> <br />一般而言,保护模式下的可转载 2010-08-24 18:48:00 · 824 阅读 · 0 评论 -
Linux系统调用接口、系统调用例程和内核服务例程之间的关系
<br />系统调用接口的主要任务是把进程从用户态切换到内核态。在具有保护机制的计算机系 统中,用户必须通过软件中断或陷阱,才能使进程从用户态切换为内核态。<br /> 在i386体系中,Linux的系统调用接口是通过调用软中断指令“int $ Oxso”使进程从用户态进入内核态的,这个过程也叫做“陷入”。当系统调用接口调用软中断指令“int $ Ox80”时,这个指令会发生一个中断向量码为128的中断请求,并在中断响应过程中将进程由用户态切换为内核态。<br /> 因为Linux只允许系统调用接口使用转载 2010-08-25 22:29:00 · 3438 阅读 · 0 评论 -
80386在保护模式下的中断和异
中断和异常<br />学过8086/8088汇编的人肯定对于中断这个概念都不陌生。在80386中,这个概念在一定程度上发生了变化,并引入了“异常”这个新概念。本篇文章就是围绕在操作系统开发中涉及到中断和异常的讨论。中断<br />中断在系统中是由外部事件所引起的,如:一次I/O操作的结束。其产生与CPU当前所执行的指令没有关系。从是否能够被屏蔽来划分,可将其分为两类,即可屏蔽中断与不可屏蔽中断,其中前者由CPU的INTR引脚接收信号,后者由NMI引脚接收信号。<br />由于产生中断的中断源并不单一,因此在转载 2010-08-25 22:32:00 · 2729 阅读 · 0 评论 -
什么是重定位?
<br />6.1 存储器的基本概念<br /> 主存储器管理仍然是今天操作系统十分重要的内容;能否合理而有效的使用主存,在很大成度上反映了操作系统的性能,并直接影响到整个计算机系统作用的发挥。<br />6.1.1 存储器的层次<br /> 目前在许多计算机系统中,采用三级存储器结构,即高速缓冲存储器、主存储器和外部存储器。<br />三级存储器的比较<br /> 从高速缓存到外存,其容量愈来愈大,一般每级之间相差几个数量级。而访问数据的速度则愈来愈慢,价格也愈来愈便宜。 <转载 2010-08-24 18:40:00 · 1206 阅读 · 0 评论 -
Windows可执行文件简述(一)
<br />操作系统中的文件是一种抽象的机制,提供了一种在磁盘上保存信息而且方便以后读取的方法。在Windows操作系统中,一个用户可以最直接体会到的文件的形式就是以.exe、.dll等为扩展名的可执行文件。伴随着Windows操作系统的不断进步,其可执行文件的格式也发生了巨大变化。这期间主要有4个过程:DOS中出现的最简单的以.com为扩展名的可执行文件和以.exe为扩展名的MZ格式(MZ是MZ格式的主要作者Mark Zbikowski的名字的缩写)的可执行文件,Win 3.x下出现的NE(New Exe转载 2010-08-24 18:42:00 · 1022 阅读 · 0 评论 -
关于LEA指令
<br />堆栈种分配的局部变量所谓的“标号”,你以为是什么?(都是那些该死的宏惹的祸,大家要都是老老实实写代码,就不会有这些疑问了)。 <br /> 比如你用local在栈上定义了一个局部变量LocalVar,你知道实际的指令是什么么?一般都差不多像下面的样子: <br /> push ebp <br /> mov esp, ebp <br /> sub esp, 4 <br /> 现在栈上就有了4各字节的空间,这就是你的局部变量。转载 2010-09-28 16:34:00 · 7573 阅读 · 2 评论