当前位置:首页 » 操作系统 » linux汇编指令

linux汇编指令

发布时间: 2022-05-14 08:28:27

① 如何在linux下执行汇编命令

好像是as或gas,man下试试

② 通过几个简单的Linux命令,深入理解c语言

主要使用gcc命令以及以下几个参数:

-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>

环境配置好以后,让我们开始c语言的编译之旅吧~

编写c语言源代码
很多linux命令都可以新建一个文件,比如

$ touch test.c

建立一个空白的文件

$ vim test.c

使用vim(文本编辑器)编辑test.c,如果test.c不存在,则创建

$ echo "123" > test.c

通过输出重定向新建一个文件

创建完test.c后,将下面这段Hello World代码写到test.c中(很多方法)

#include <stdio.h>
int main(){
printf("Hello world\n");
return 0;
}

写完之后可以使用ls命令来查看当前目录下的文件,检查test.c是否存在

$ ls

使用cat命令查看test.c中的内容,检查是否写入成功

$ cat test.c

ls-cat

展开头文件(预处理)
$ gcc -E test.c -o test_pre.c

这个命令把源代码test.c中的头文件展开,并把结果输出到test_pre.c

(可以使用cat或者vim命令查看test_pre.c文件中的内容)
per
test_pre.c中的内容是这样的,可以发现原本几行的代码变成了几百行,而且已经见不到include关键字了,取而代之的是一些变量定义的代码,这些代码就是stdio.h中的内容,和stdio.h中头文件展开后的内容。

编译
$ gcc -S test_pre.c -o test_asm.s

这一条命令将上一步预处理过后的源代码编译成为汇编代码

asm
现在看到的是test_asm.s里面的汇编代码。

什么是汇编?

汇编语言是汇编指令集、伪指令集和使用它们规则的统称,使用具有一定含义的符号为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令。

简单的可以理解为汇编语言是一本词典,01100101011010这样的二进制字符串是单词,汇编指令是单词的含义。计算机能读懂二进制字符串,而人能读懂的是翻译过来的汇编指令。

汇编
$ gcc -c test_asm.s -o test_obj.o

这一步将test_asm.s汇编成为目标文件,目标文件中存储的就是010101010这样的字符串了,可以用cat命令试试去读取test_obj.o

obj

可以发现打印出来许多不可见的字符,原因是目标文件已经是二进制格式的了,不同于源代码(文本格式)

有关文件的格式可以看下这里的介绍:
http://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html

链接
链接器负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

这个例子中没有附加的目标文件,所以只需要目标文件做被链接的对象。

有关链接器的详细讲解大家可以看下这里:
https://www.hu.com/question/27386057

$ gcc test_obj.o -o hello

gcc本身可以充当链接器,这里使用gcc命令将目标文件test_obj.o链接成了可执行文件hello

ld

运行程序!
至此,源代码已经经历了预处理、编译、汇编、链接四步成为了可执行文件,现在试着运行一下这个程序吧

$ ./hello

hello

小结
首先我们创建了源文件test.c,然后用gcc -E将源文件中的头文件展开,这一步叫做预处理;
之后通过gcc -S将预处理后的源文件编译了汇编代码,这一步叫做编译;
接着使用gcc -c命令将汇编代码转换成了二进制的目标文件,这一步操作叫做汇编;
目标文件不同于源代码,是二进制格式,是源文件编译过程中产生的中间文件,通过链接器可以将多个目标文件链接成为可执行文件,这一步叫做链接。

源文件->(预处理->编译->汇编->链接)->可执行文件

一般大家所说的c语言编译,其实是上述这四步的简称。

③ linux内核:什么叫做内联汇编

就是在C语言中可以插入汇编语言,,,
比如 插入汇编
----------------C语言----------------
ASM
{
mov r1,r2
stl r2,0101 代码我乱写的 我给你看个大概而已
}
----------------C语言----------------

当然 要嵌入汇编
最开始的宏定义还要加上
#include <linux/asm> 好像是这个..好久不做linux了..最近作FPGA 都糊涂了

④ Linux系统里如何编译汇编程序。

linux 编译汇编程序常用的有两种,一种是A&T方式的,你gcc 就可以编译了。还有一种是80X86方式,一般是用NASM,NASM你要在安装LINUX时就要添加软件包,或者你进入图型界面,增加NASM软件包,就可以编译了。

⑤ 如何在64位的Linux系统上使用汇编和C语言混

编译和链接的时候使用的指令:(AMD处理器,64位操作系统)
编译链接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
汇编语言用nasm编写并用nasm编译器编译,而C语言用的是gcc编译,这些都没有问题,但是在链接的时候出错了,提示如下:
ld: i386 architecture of input file `foo.o' is incompatible with i386:x86-64 output
google了一下,意思就是nasm 编译产生的是32位的目标代码,gcc 在64位平台上默认产生的是64位的目标代码,这两者在链接的时候出错,gcc在64位平台上默认以64位的方式链接。
这样在解决的时候就会有两种解决方案:
<1> 让gcc 产生32位的代码,并在链接的时候以32位的方式进行链接
在这种情况下只需要修改编译和链接指令即可,具体如下:
32位的编译链接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具体的-m32 和 -m elf_i386 请自行查阅gcc (man gcc)

如果你是高版本的gcc(可能是由于更新内核造成的),可能简单的使用-m32 的时候会提示以下错误(使用别人的历程,自己未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
这应该是缺少构建32 位可执行程序缺少的包,使用以下指令安装:
sudo apt-get install libc6-dev-i386
此时应该就没有什么问题了。

⑥ 有没有懂linux内核源码中的汇编代码的#define switch_to(n){struct {long a, b;}__tmp; __asm__("cmpl "

用的at&t汇编,也就是Linux下的汇编语言,跟Intel x86汇编翻译成i386指令是一样的,就是写法和符号不同。
里面应该是__asm__()后面跟的是一个字符串,包含大量转义字符,你把转移字符翻译成对于的格式再看.

⑦ 嵌入式linux:很简单的汇编指令,关于LDR R0,R1

答案是B.
确切地说是,R1的数据+R2的数据合成一个地址值,该地址中存放的数据赋值给R0
LDR指令是从某存储空间取数据,赋值给某寄存器.
这是ARM汇编,和Linux有什么关系?
建议看看ARM汇编的解释

⑧ 对linux上的汇编的一些疑问

这是at&t格式的汇编
===================================
局部标号可以用数字,而且可以重复。在以这些标号为目的的转移指令上,标号要带上后缀,b表示向前,f表示向后。
例:
orw %bx,%bx
jz 1f
1:
movl $0x101000,%eax
movl %eax,%cr3 /* set the page table pointer.. */
movl %cr0,%eax
orl $0x80000000,%eax
movl %eax,%cr0 /* ..and set paging (PG) bit */
jmp 1f /* flush the prefetch-queue */
1:
movl $1f,%eax
jmp *%eax /* make sure eip is relocated */
1:
绝对跳转/调用指令中的内存操作数必须以’*’为前缀,否则gas总是认为是相对跳转/调用指令,而且gas汇编程序自动对跳转指令进行优化,总是使用尽可能小的跳转偏移量。如果8比特的偏移量无法满足要求的话,as会使用一个32位的偏移量,as汇编程序暂时还不支持16位的跳转偏移量,所以对跳转指令使用’addr16’前缀是无效的。还有一些跳转指令只支持8位的跳转偏移量,这些指令是:
’jcxz’,’jecxz’,’loop’,’loopz’,’loope’,’loopnz’’loopne’
如果你在汇编中使用了这些指令,用gas的汇编可能会出错,因为gcc在编译过程中不产生这些指令,所以在c语言中不必担心这些问题。
Array、 实模式下的语法与Intel指令语法基本相同;可以用上述格式的汇编单独写程序(有许多宏定义和它特有的文件格式),而后用gcc/gas将其汇编成目标代码。在linux中,这种形式的代码主要集中在启动部分。

⑨ 同样的处理器,对于Linux和windows他们的汇编指令集是相同的么,他们之间的关系是怎样

指令是针对CPU的,如PC机的CPU一般使用复杂指令系统,可以使用汇编语言进行编程。而操作系统是运行在硬件上的系统软件,不同的操作系统编译后可以在相同的硬件系统运行。

⑩ LINUX下面进行8086汇编

linux的内核中有很多汇编语言,但gcc是linux的唯一指定编译器,说明汇编的编译同样使用gcc,只是命令参数不一样

我美编写过8086汇编,但我编译过内核,确实不需要其他编译器

回答补充:

原来是编辑器的问题,我还以为你找的全套流程呢。

我连vim都没碰过,平时都是gedit,只有自动缩进一项功能,还很弱智,帮不上你了

这儿一点参考资料,贴出来,虽然有可能用不上

http://www.ibm.com/developerworks/cn/linux/l-assembly/

热点内容
使命召唤生化武器怎么配置 发布:2024-10-10 13:13:15 浏览:490
磁盘阵列怎么配置管理口 发布:2024-10-10 13:10:05 浏览:187
如何撤销自己的配置 发布:2024-10-10 12:41:47 浏览:687
win7无法复制文件夹 发布:2024-10-10 12:40:11 浏览:147
文章存储结构 发布:2024-10-10 12:40:11 浏览:881
添加多个FTP网站的方法有哪些 发布:2024-10-10 12:03:03 浏览:842
表格怎么调用网页数据库数据库数据 发布:2024-10-10 11:37:33 浏览:657
海力压缩机 发布:2024-10-10 11:32:26 浏览:526
洗过的海带存储方法 发布:2024-10-10 11:19:00 浏览:241
64H的源码 发布:2024-10-10 11:06:01 浏览:153