汇编语言
文章平均质量分 84
nginux
阿里巴巴
展开
-
arm/arm64函数栈帧(stackframe)结构和传参规则
本文汇编代码的平台及编译器:arm/gcc。分析函数调用栈的规则对于理解程序运行基本原理很有帮助,汇编代码分析crash问题也大有裨益。本文示例代码通过C语言函数调用一个汇编函数,再从汇编函数跳转回C函数,分析该示例的汇编代码就可以stack frame的创建和arm函数调用的传参规则。arm32使用哪些寄存器传参,如果参数超过4个怎么传参?arm32/gcc中函数调用stack frame的创建,以及函数返回stack frame的销毁过程是怎样的?原创 2022-08-20 22:12:03 · 3937 阅读 · 0 评论 -
ELF格式分析动态链接原理
objdump -r elf(readelf -r也可以)可以读取rel.dyn变量重定位段,获取需要重定位的变量的相关信息,其中offset字段就是该变量的重定位地址对应的.got(GOT)的表项,比如global_module的offset = 1fdc(正如上面汇编计算的结果),对应的是.got(GOT)表中global_module的表项地址。跳转到.plt section首地址处执行代码,该处代码会会跳转到GOT表项的第三项,存储的是链接器的符号解析函数(装载时才能确定该地址,初始化时为0)...原创 2022-08-07 23:59:34 · 805 阅读 · 1 评论 -
汇编视角分析C++虚函数实现原理
虚函数是c++语言非常重要的机制,日常的c++编程工作中经常使用虚函数,通过汇编视角来探究虚函数的实现原理,有助于深刻理解虚函数的内部机制。c++语法规范并没有规定虚函数的具体实现方案,不同的编译器实现方式可以不同,本文基于arm32平台,g++编译器来分析虚函数表的实现机制,基本主流编译器的原理基本是相似的,所以理解g++实现方案再去分析其他编译器的实现也是类似的。......原创 2022-08-07 17:43:22 · 597 阅读 · 0 评论 -
arm push/pop/b/bl汇编指令
push支持同时将多个寄存器入栈,格式{xx,xx},如push{r0,r1,r2}BL函数条跳转前执行LR=PC-4;如同push一样,pop也支持同时pop出栈多个寄存器。原创 2022-07-31 15:48:04 · 7730 阅读 · 3 评论 -
arm ldr/ld/数据加载系列指令和adr指令
可以看到由于采用了[r0,#1]pre-indexed的memoryaccess方式,r4寄存器加载的值来自于地址r0+1。说明最终访问内存的地址=Rn,这种操作后Rn的值=Rn+offset,跟pre-indexed的核心区别在于加载的值来自地址Rn(更新前前),类似于i++,这种操作后Rn的值=Rn+offset,注意加载的值来自地址Rn+offset的值(更新后),类似于++i。说明最终访问内存的地址=Rn+offset,这种操作后Rn的值不会改变。.....................原创 2022-07-30 23:21:21 · 2104 阅读 · 0 评论 -
段寄存器(8086CPU)和代码段
1.段寄存器8086CPU有4个段寄存器:CS、DS、SS、ES。当8086CPU访问内存时,由这4个段寄存器提供内存单元的段地址。CS和IP是8086中最关键的寄存器,他们指示了CPU当前要读取指令的地址。CS是代码段寄存器,IP为指令指针寄存器。在8086PC机中,任意时刻,设CS中的内容是M,IP中的内容是N,8086CPU将从内存地址:M*16+N处读取指令并执行。也可以这原创 2014-04-28 22:30:29 · 3924 阅读 · 0 评论 -
汇编的数据段和栈
1.原创 2014-04-29 11:37:53 · 1778 阅读 · 0 评论 -
x86 32位机的特权保护
优先级划分、指令的权限检查和超出权限访问的异常处理等是构成特权保护的基础。本文将试图讲解为大家解决两大问题:--win32汇编中为什么找不到中断指令的应用?比如int 7ch--windows错误的‘蓝屏’是从哪里来的?保护模式下,中断或异常往往从用户代码切换到操作系统代码中执行。由于保护模式下的代码有优先级之分,因此出现从优先级低的应用程序转移到优先级高的系统代码的问题,如果优先级低原创 2014-05-03 20:18:48 · 1133 阅读 · 0 评论 -
对int、iret和栈的深入理解
我们以一个程序来展开讨论:用7ch中断例程完成loop指令的功能,在屏幕中间显示80个"!"1.程序框架如下assume cs:codecode segmentstart: mov ax,0b800h ;向8086CPU显存的地址 mov di,160*12 ;显示位置 mov bx,offset s-offset se ;跳转的位移 mov cx,80 ;循环次数s: m原创 2014-05-03 09:55:40 · 2489 阅读 · 0 评论 -
内中断
1.CPU根据中断码如何找到中断处理程序要定位中断处理程序,就需要找到中断处理程序的段地址和偏移地址,如果根据中断码找到他们?这就引入中断向量表,CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。2.使用中断类型码找到中断向量,并用它设置CS和IP,这个操作是由CPU硬件自动完成的。这个过程成为中断过程:(1)从中断信息中取得中断类型码(2)标志寄存器的值入栈原创 2014-05-02 22:30:08 · 1187 阅读 · 0 评论 -
DF标志和串移动指令(movsb/movsw)
1.标志寄存器的第10位DF,方向标志位。在串处理指令中,控制每次操作后si,di的增减DF=0,每次操作后,si、di增加DF=1,每次操作后,si、di减小我们可以用汇编语法描述movsb的功能如下:mov es:[di],byte ptr ds:[si] ;8086不支持这样的指令,仅做描述之用如果DF=0:inc siinc di如果DF=1:dec si原创 2014-05-03 08:16:12 · 3611 阅读 · 0 评论 -
cmp指令
1.cmp是比较指令,cmp原创 2014-05-02 20:29:08 · 3312 阅读 · 0 评论 -
ret和call的原理
1.ret指令用栈中的数据,修改IP的内容,从而实现近转移CPU执行ret指令时,进行下面两步操作:(1)(IP)=((ss)*16+(sp)) //使用栈顶元素修改IP实现跳转(2)(sp)=(sp)+22.retf用栈中的数据,修改CS和IP的内容,从而实现远转移CPU执行retf指令时,进行下面四步操作:(1)(IP)=((ss)*16+(sp))原创 2014-05-01 22:29:15 · 1774 阅读 · 0 评论 -
汇编转移指令的原理
1.操作符offset操作符offset在汇编语言中是由编译器处理的符号,他的功能是取得标号的偏移地址比如下面程序:assume cs:codesgcodesg segmentstart:mov ax,offset start相当于mov ax,0 s:mov ax,offset s相当于mov ax,3codesg endsend start在上原创 2014-05-01 16:00:28 · 1696 阅读 · 0 评论 -
CPU的标志寄存器
1.ZF零标志位,执行指令后结果为0,ZF=1,否则ZF=02.PF奇偶标识位,它记录相关指令执行后,其结果的所有二进制位中1的个数是否为偶数,如果是偶数,PF=1,否则PF=1。3.SF符号标识位,它记录相关指令执行后,其结果是否为负,如果是负数SF=1,否则,SF=0SF是CPU对有符号数进行运算结果的一种记录,它记录数据的正负。在我们将数据当做有符号数原创 2014-05-02 10:47:50 · 1237 阅读 · 0 评论 -
[bx]和loop指令
1.[bx]的含义[bx]表示一个内存单元,它的偏移地址在bx中,比如:mov ax,[bx]会将一个内存单元的内容送入ax,这个内存单元的长度是2个字节,存放一个字,偏移地址存放在bx中,段地址在ds中。mov al,[bx]则是移动半个字。2.loop指令loop 标号CPU执行loop指令的时候分两步:1.(cx)=(cx)-12.判定cx中的值,不为零则转至原创 2014-05-01 08:29:35 · 887 阅读 · 0 评论 -
汇编基础知识
1.SI和DI功能和bx相似,只是不能分成2个8寄存器使用。2INC ax指令将寄存器的内容加1mov ax,0inc ax执行完毕ax=13.bx,si,di,bp寄存器CPU的核心是寄存器,学习汇编这么一段时间,我也深刻体会到对寄存器理解的重要性(1)在8086CPU中,只有这4个寄存器可以在[...]中来进行内存单元的寻址。比如下面指令是正原创 2014-05-01 09:39:57 · 1156 阅读 · 0 评论 -
代码段中存放数据
1.前面我们写的程序中,只有一个代码段,我们先来在代码段中使用数据,看看和单独一个数据段存放数据有什么差别。考虑这样一个问题,编程计算以下8个数据的和,结果存放在ax寄存器中:0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H我们希望循环进行累加,所以要将数据存放在一个连续内存当中,如何将这些数据存储在一组地址连续的内存单元中呢?我们可以用指原创 2014-04-30 15:33:49 · 3370 阅读 · 0 评论 -
将数据、代码、栈放到不同的段(感觉很好)
1.将数据、栈都放到代码段中太混乱了,所以将他们原创 2014-04-30 20:30:49 · 1115 阅读 · 0 评论