导航:首页 > 编程系统 > linuxjmpesp

linuxjmpesp

发布时间:2024-07-02 19:49:08

1. linux 内核0.11阅读困惑

1、你说的“图5-3显示, fs先入栈,ebx后入栈”是不对的,恰好反了。
书上原话"在开始内执行程序容之前,堆栈指针 esp 指在中断返回地址一栏 ( 图中 esp0 处 ) 。当把将要调用的 C 函数do_divide_error()或其它 C 函数地址入栈后,指针位置是 esp1 处",这已经说明esp0的地址高于esp1的地址。同理ebx地址高于fs地址,即ebx先入栈。
2、3都是关于gnu内嵌汇编问题,需要自己看书的。
#define outb_p(value,port) \
__asm__ ("outb %%al,%%dx\n" \
"\tjmp 1f\n" \
"1:\tjmp 1f\n" \
"1:"::"a" (value),"d" (port))
相当于:
mov (value),%eax
mov (port),%edx
outb %al,(%dx)
就是给某个端口port发数据value的,<<微机接口>>里很多例子,例如给中断控制器8259A初始化就是这样做的。

2. 谁知道在linux下的常用后缀名啊

在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件版和不可执行文件。而gcc则通权过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C++源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。

3. 关于Linux中禁用中断和锁定的关系问题

首先原子操作是通过local_irq_enable()这个宏来实现,这个宏实现了硬件中断和软件中断的屏版蔽。这样CPU就不权能被软件中断,如线程抢占。而当硬件中断产生时,会将其结果保存到中断控制器的SRCPND(resource-pend)寄存器中,然后将SRCPND的内容送去做中断屏蔽检测,这一工作由设置MASK寄存器相应的位完成,如果全部屏蔽,硬件中断就不会产生了。当然了,每种处理器都有自己的中断处理方法,通常的流程是这样。

4. 如何在C语言中嵌入汇编

以下所说嵌入的汇编都是 的C语言中嵌入ARM汇编。

1)2个参数的内嵌语句

这种形式的汇编用于简单的语句,参数限制输入和输出语法格式如下:

asm(code : output operand list : inputoperand list : clobber list);

汇编和C语句这间的联系是通过上面asm声明中可选的output operand list和input operand list。Clobber list后面再讲。

下面是将C语言的一个整型变量传递给汇编,逻辑左移一位后在传递给C语言的另外一个整型变量。

/* Rotating bits example */

asm("mov %[result], %[value], ror#1" : [result] "=r" (y) : [value] "r" (x));

每一个asm语句被冒号(:)分成了四个部分。

 汇编指令放在第一部分中的“”中间。

"mov %[result], %[value], ror #1"

 接下来是冒号后的可选择的output operand list,每一个条目是由一对[](方括号)和被他包括的符号名组成,它后面跟着限制性字符串,再后面是圆括号和它括着的C变量。这个例子中只有一个条目。

[result] "=r" (y)

 接着冒号后面是输入操作符列表,它的语法和输入操作列表一样

[value] "r" (x)

为了增加代码的可读性,你可以使用换行,空格,还有C风格的注释。

asm("mov %[result], %[value], ror#1"

: [result]"=r" (y) /* Rotation result. */

: [value]"r" (x) /* Rotated value. */

: /* No clobbers */

);

在代码部分%后面跟着的是后面两个部分方括号中的符号,它指的是相同符号操作列表中的一个条目。

%[result]表示第二部分的C变量y,%[value]表示三部分的C变量x;

符号操作符的名字使用了独立的命名空间。这就意味着它使用的是其他的符号表。简单一点就是说你不必关心使用的符号名在C代码中已经使用了。在早期的C代码中,循环移位的例子必须要这么写:

asm("mov %0, %1, ror #1" :"=r" (result) : "r" (value))

在汇编代码中操作数的引用使用的是%后面跟一个数字,%1代表第一个操作数,%2代码第二个操作数,往后的类推。这个方法目前最新的编译器还是支持的。但是它不便于维护代码

实例代码:

2) 带.s文件的汇编

编译命令:

arm-linux-gcc main.cAsmfile_gnu.s -o mains

main.c

#include<stdio.h>

extern voidpcm8_2_pcm16(unsigned char* pIn, int nInlen, short* pOut);

extern voidpcm16_2_pcm8(short* pIn, int nInlen,unsigned char* pOut);

int main()

{

unsigned char* pIn="1234";

short pInd[256];

unsigned char pOutd[256];

int nInlen=4;

int i = 0;

short pOut[256];

for(i=0;i<4;i++)

printf(" 0x%x ",pIn[i]);

printf(" ");

memset((char *)pOut,0,256*2);

memset((char *)pInd,0,256*2);

memset((char *)pOutd,0,256*2);

pcm8_2_pcm16(pIn,nInlen,pOut);

for(i=0;i<4;i++)

printf(" 0x%x ",pOut[i]);

printf(" ");

memcpy((char *)pInd,(char *)pOut,256*2);

pcm16_2_pcm8(pInd,nInlen,pOutd);

for(i=0;i<4;i++)

printf(" 0x%x ",pOutd[i]);

printf(" ");

return 0;

}

Asmfile_gnu.s

.text

.global pcm8_2_pcm16

.global pcm16_2_pcm8

#*******************************#

#********* ENCODER 实现将第一个输入参数

#左移8位然后异或0x8000 然后拷贝到第三个参数

#DECODE 取第一个参数所指的数据先异或0x8000

#然后右移8位将数据拷贝到第三个参数

#*******************************

pcm8_2_pcm16:

MOV R6,#0

MOV R7,#0

ENCODER:

LDRB R5,[R0,R6]

MOV R8,R5,LSL#8

EOR R9,R8,#0x8000

STRH R9,[R2,R7]

ADD R7,R7,#2

ADD R6,R6,#1

SUB R1,R1,#1

CMP R1,#0

BNE ENCODER

B OVER

pcm16_2_pcm8:

MOV R6,#0

MOV R7,#0

DECODE:

LDRH R5,[R0,R6]

EOR R8,R5,#0x8000

MOV R9,R8,LSR#8

STRB R9,[R2,R7]

ADD R7,R7,#1

ADD R6,R6,#2

SUB R1,R1,#1

CMP R1,#0

BNE DECODE

OVER:

.end

阅读全文

与linuxjmpesp相关的资料

热点内容
win10怎么模仿有鼠标 浏览:168
传统数据加密方法是什么 浏览:145
苹果4s停机无id密码怎样解锁 浏览:631
linux桌面垃圾箱 浏览:187
无文件夹 浏览:401
大数据中文视频 浏览:812
php删除文件夹 浏览:888
flow3d安装教程 浏览:673
json解析数据插件 浏览:37
编程速度很慢怎么回事 浏览:53
文件管理怎么找不到文件夹了 浏览:788
孢子win10崩溃 浏览:584
电视不支持的文件格式mp4 浏览:664
对被解释变量数据样本有什么假定 浏览:937
xml转化为csv文件格式 浏览:348
大数据培训那家好 浏览:576
家庭组可以不设置密码吗 浏览:943
江苏移动app是什么 浏览:27
mysql备份数据库linux 浏览:803
数据库软件怎么使用 浏览:868

友情链接