;以下是16位汇编 创建静态库,并调用静态库中的函数 ;多文件汇编格式 ;编译方法(此处用的是masm 5.0,如果是其他的编译器,有可能不能编译) ;第一种,编译方法 ;1.masm main.asm  生成.obj文件 ;2.masm lib.asm  生成.obj文件 ;3.link main.obj lib.obj 生成.exe文件 ;第二种,编译方法 ;1.masm main.asm  生成.obj文件 ;2.masm 16lib.asm  生成.obj文件 ;3.lib 16lib.…
解决QZ-SDK静态库libRPToolLib.a中avfoundation.o文件和kxMovie依赖的ffmpeg静态库libavdevice.a函数重复定义的问题 在原来项目中导入全志v3相机的SDK静态库libRPToolLib.a,编译通过,但链接报错,具体如下:     问题描述: libRPToolLib.a和libavdevice.a两个第三方库都包含avfoundation.o这个文件,这两个.o中定义了相同的函数名.C语言全局函数,名称不能重复.   解决方案: 在i386.…
今日,有同事问我.rgb555模式下的位图文件的格式问题,于是花了一下午的时间通过推測与測试,分析出了例如以下bmp文件在rgb555模式下的文件存储规律: 1:bmp文件的文件信息头中的biBitCount数据应该为16 在rgb555模式下,一个像素占用2字节.rgb分别占用5位,另外有一位是填充位. 2:16位数据的组成例如以下 第一个字节:g5g4g3b7b6b5b4b3 第二个字节:0r7r6r5r4r3g7g6 当中第二个字节的左边第一位为填充位.我在实验中用0填充. 3:该16位b…
原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = -1; void push(char c) {         stack[++top] = c; } char pop(void) {         return stack[top--]; } int is_empty(void) {         return top == -1; }…
在project中创建静态库文件时.默认会将一些Symbols加到静态库文件里.这样做有两个缺点: 1.假设引用静态库文件的project中发生了bug.就会直接跳转到静态库的源代码. 也许有人问:静态库中的不都是汇编或二进制数据吗,怕什么被追踪到?别忘了,有些人是会看汇编的.还有IDA这类神器在,主要是为了防逆向. 2.静态库文件的大小会因此翻几番.本人近期做的这个静态库文件里,去掉symbols前大小为7.8MB左右,去掉以后大小为2.8MB. 要去掉Symbols.首先打开Build Se…
http://www.cnblogs.com/dyllove98/archive/2013/06/25/3155599.html 目录树结构: test/include/hello.h #ifdef _HELLO_H_ #define _HELLO_H_ void hello(); #endif test/src/hello.c #include "hello.h" #include <stdio.h> void hello() { printf("hello w…
先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html 一.  编译不同目录下的多个文件 各个文件的布局如下: head.h文件的代码: #ifndef  HEAD_H #define  HEAD_H int add(int a, int…
1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去手动打包到我们的可执行文件当中.我们知道,打包一个文件,里面的东西非常之多,当我们加载时,内存会被很多的代码块锁占用,因而常常有一种,调用一个函数,而不得不去读取一大片的代码块儿的感觉.这就是静态库的缺点没有之一 就像写一个这样的程序: #include<stdio.h> #include<…
问题: 之前一直在做静态库的编写与维护,也一直知道静态库的图片资源是没办法打进.a中的.可是突然有个想法.由于有非常多參数的配置是在一个plist文件里的.尽管也知道这是一个plist文件,可是想想和图片资源还是有一定差别的.所以就尝试着是否能把plist打进静态库中. 分析: 1. 创建了一个简单的生成静态库的功能,然后公开了一个接口.用来输出读取plist文件的结果. 2. 创建一个简单的project,来使用上一步生成的.a文件,然后调用那个公开的接口. 3. 结果是无法读取,输出为nul…
转载来源:https://www.cnblogs.com/hookjc/ 静态库 在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项: d -----从指定的静态库文件中删除文件 m -----把文件移动到指定的静态库文件中 p -----把静态库文件中指定的文件输出到标准输出 q -----快速地把文件追加到静态库文件中 r -----把文件插入到静态库文件中 t -----显示静态库文件中文件的列表 x -----从静态库文件中提取文件 还有多个修饰符修改以上基本选项,详细请…
最近在学习王爽的<汇编程序>,参考<简单OS开发前奏<一>EDITPLUS+MASM32搭建汇编开发环境(16位+32位)>http://www.cnblogs.com/tishion/archive/2010/09/09/1822438.html 的博文,而我用的是Sublime Text3. ST3不用我介绍了吧,安装.汉化.PJ.安装Packing Control请自行Google下. 1.安装Masm32程序到F盘,Masm32包含有丰富的库和编译程序. 2.写…
一.MASM汇编器中的数据类型 二.Intel汇编中的立即数类型 三.定义有符号和无符号整数 四.小端序 内存中数据按照字节存储,一个4个字节无符号整数,其高位存储在低地址上,低位存储在高地址上. 比如0x12345678这个整数,在内存中按照内存地址从小往大排列是:0X78 0x56 0x34 0x12 五.汇编代码验证 INCLUDE Irvine32.inc includelib Irvine32.lib includelib kernel32.lib includelib user32.…
环境: win7_x64旗舰版.VS2015企业版 一.Intel保护模式.实地址模式和虚拟8086模式指令格式(x86) 图在Intel手册2.1章节 1.1)Instruction Prefixes:指令前缀,可选项,每个前缀一个字节,可选0个前缀到4个不等:指令前缀分为四组,每组都允许设置指定的前缀代码. Group 1:锁定和重复前缀. Group 2:段覆盖前缀. Group 3:操作数大小覆盖前缀. Group 4:地址大小覆盖前缀. 1.2)Opcode:操作码,这是唯一不可省略的…
由于绝大多数的国内程序员以前只接触过Intel格式的汇编语言,很少或几乎没有接触过AT&T汇编语言,虽然这些汇编代码都是Intel风格的.但在Unix和Linux系统中,更多采用的还是AT&T格式,两者在语法格式上有着很大的不同,其实完全可以使用原来汇编的思路解决问题,只要掌握下面两者的不同: 一.在AT&T汇编格式中,寄存器名要加上' %'作为前缀:而在Intel汇编格式中,寄存器名不需要加前缀.例如: AT&T格式 Intel格式 pushl %eax push eax…
7.3  移位和循环移位的应用 7.3.1  多双字移位 要对扩展精度整数(长整数)进行移位操作,可把它划分为字节数组.字数组或双字数组,然后再对该数组进行移位操作.在内存中存储数字时通常采用的方式是最低字节在最低的地址位置上(小尾顺序).下面的步骤以一个双字节数组为例,说明了如何把这样的一个数组右移移位: ArraySize = 3 .data array DWORD ArraySize DUP(?) 1.把ESI的值设置为array的偏移. 2.把最高位置[ESI+8]处的双字右移一位,最低…
留作备忘: gcc -S -masm=intel xxxx.c 生成elf可执行文件: gcc -o xxx xxxx.s 反汇编 objdump xxx 补充: 在使用gcc 对C语言程序进行编译时,可细分为四个阶段:预处理(Pre-processing).编译(Compiling).汇编(Assembling).链接(Linking).用test.c为例说明: 1)预处理:gcc -E test.c -o test.i 对预编译指令都做相应的处理 2)编译:gcc -S test.i -o…
php-7.2.3 在“汇编php文件”和“执行opcode代码”上做了大量改变php-5.6.26 没见到支持抽象语法树的相关代码,php-7.2.3 见到支持抽象语法树的相关代码php-5.6.26 存在“保存active_op_array现场”的代码,php-7.2.3 去除了“保存active_op_array现场”的代码 php-5.6.26 php-7.2.3 .初始化 opcode处理器列表// main实现在文件“php-5.6.26\sapi\cgi\cgi_main.c” i…
另一篇汇编学习笔记AT&T Assembly on Linux  (linux下) mov ax,bx     bx到ax 读数据过程:cpu通过地址线发送地址a,控制线向存储器发送读命令,存储器对地址a进行读,通过数据线返回. 写数据过程:与读同理. 上述是cpu执行数据读写命令的过程,我们只需让cpu执行mov ax,[3],cpu便会自动执行上述过程. 对于汇编程序员来说,CPU中主要部件是寄存器.寄存器是CPU中程序员可以用指令读写的部件.程序员通过改写各种寄存器中的值来实现对CPU的控…
在去年写过如何bc3.1编译ucos,不过现在很少去用到,但是那是用dosbox也是懵懵懂懂的,参见https://blog.csdn.net/liming0931/article/details/82320088 随着c语言使用的不断熟悉,偶尔看到一篇pdf,是姚新颜写的<c语言的标准和实现>,里面有提到如果要深入学习c语言,要懂点x86的汇编,之前我增加学过51的汇编,多多少少有点理解,就是x86的很多寄存器和51的不一样,自然界联想到了王爽的<汇编语言>第三版,那么学习之前要…
编译多个源代码文件会生成多个目标文件,每个目标文件都包含一个源文件的机器码和相关数据的符号表.除非使用-c选项指示 GCC 只编译不链接,否则 GCC 会使用临时文件作为目标文件输出: $ gcc -c main.c $ gcc -c func.c 这些命令会在当前目录中生成两个目标文件,分别是 main.o 和 func.o.把两个源文件名放在同一个 GCC 命令中,也可以获得同样的结果: $ gcc -c main.c func.c 然而,实际上编译器通常每次只会被调用来完成一件小型任务.大…
第八章 高级过程 8.1 简介 本章主要讲: 堆栈框架 变量作用域和生存期 对战参数的类型 通过传递值或者传递引用来传递参数 在堆栈上创建和初始化局部变量 递归 编写多模块程序 内存模型和语言关键字 注意关键词: 子过程=函数=方法(因不同语言导致名字不统一) 8.2堆栈框架(很重要) 堆栈框架(stack frame)也称活动记录(activation record),它是为传递的参数.子例程的返回地址.局部变量和保存的寄存器保留的堆栈空间.堆栈框架是按一下步骤创建的: 1.如果有传递的参数,…
7.5  扩展加法和减法 扩展精度的假发和减法是指任意尺寸大小数字的加法和减法.例如要求你写一个C++程序,把两个1024位的整数相加,解决方案可不是那么简单!但在汇编语言中,ADC(带进位加)指令和SBB(带进位减)指令非常适合于解决此类问题. 7.5.1  ADC指令 ADC(AddWithCarry)指令把源操作数.目的操作数以及进位标志相加.指令格式与MOV指令是一样的: ADC  reg ,reg ADC  mem ,reg ADC  reg ,mem ADC  mem ,imm AD…
转自AT&T 和 Intel 汇编语法的主要区别 作为一个爱折腾的大好青年,补番之余还要补一些 Linux 下的基础,比如 GDB 的正确使用方法.但无论是看 gdb 还是 gcc -S 里的汇编,感觉都不能一下子接受这种设定. 后来发现,虽然同为 x86 汇编,但语法也分两大流派:之前上学时学的 Intel 语法,以及流行于 Unix/Linux 平台上的 AT&T 语法. 首先,两者最让人纠结的区别就是源操作数.目标操作数的顺序.AT&T 语法先写源操作数,再写目标操作数:In…
以VS2017为例 然后重新生成工程,在工程目录中就会有对应的汇编代码文件.…
2.6.1 AT&T与Intel汇编语言的比较 我们知道,Linux是Unix家族的一员,尽管Linux的历史不长,但与其相关的很多事情都发源于Unix.就Linux所使用的386汇编语言而言,它也是起源于Unix.Unix最初是为PDP-11开发的,曾先后被移植到VAX及68000系列的处理器上,这些处理器上的汇编语言都采用的是AT&T的指令格式.当Unix被移植到i386时,自然也就采用了AT&T的汇编语言格式,而不是Intel的格式.尽管这两种汇编语言在语法上有一定的差异,但…
不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 16 位代码,这个话题确实有点复古,所以能找到的资料也相应较少.要运行 x86 实模式的程序,目前我知道的只有两种方式,一种是使用 DOS 系统,另一种是把它写成引导扇区的代码,在系统启动时直接运行.很显然,许多讲自己实现操作系统的书籍都会讲到 x86 实模式,也只有自己实现操作系统引导的朋友需要…
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之间的内容按照数学公式进行排版,从而导致评论区格式混乱.如果大家的评论中用到了$,但是又不是为了使用数学公式,就请使用\$转义一下,谢谢. 想从头阅读该系列吗?下面是传送门: Linux 桌面玩家指南:01. 玩转 Linux 系统的方法论 Linux 桌面玩家指南:02. 以最简洁的方式打造实用的…
需要注意的是汇编不是一种语言,不同平台有不同的汇编语言对应,因为汇编和操作系统平台相关,所以汇编语言没有移植性.对于IA-32架构平台而言,选用的32位80386汇编语言,也就只说讨论的操作系统平台是32位的,可以执行文件的格式也是32位而不是64位或16位的. 实际分析中要知道研究的程序是运行在什么平台上,以选择相应的汇编语言,对应IA-32架构而言,IA-16架构的汇编语言原理其实和IA-32的汇编语言一样,学习过16位的80X86汇编语言的人只需要花一点时间就可以转到32位80386汇编语…
▶ 书上第 10 章,主要讲了宏,引用了一个 16 位实地址的程序,从代码开始到运行 ● 代码 ; main.asm INCLUDE Macros.inc IF IsDefined( RealMode ) INCLUDE Irvine16.inc ELSE INCLUDE Irvine32.inc ENDIF .code main PROC Startup IF IsDefined( RealMode ) mWrite <"The program is running in 16-bit…
这学期学习了汇编,在自己电脑上发现,win7的dos不支持16位实模式. 对编程来说,不能执行程序是致命的. 在经过网上搜集资料后,得到一种解决的方法--使用dosbox软件执行 dosbox简单说,就是一个dos模拟程序,支持16位实模式. 1.首先下载一个dosbox安装程序并安装,以下给出地址 http://sourceforge.net/projects/dosbox/files/dosbox/0.73/DOSBox0.73-win32-installer.exe/download 2.…