‘壹’ 怎样在linux系统下查看汇编语言
linux下将C语言编译为汇编代码,需用-S参数:
编译命令为:
$ gcc -S s1.c
如下代码:
void fun(int a,int b)
{
/*这个函数什么也不做*/
}
int main(void)
{
fun(100,200);
return 0;
}
‘贰’ LINUX下面进行8086汇编
linux的内核中有很多汇编语言,但gcc是linux的唯一指定编译器,说明汇编的编译同样使用gcc,只是命令参数不一样
我美编写过8086汇编,但我编译过内核,确实不需要其他编译器
回答补充:
原来是编辑器的问题,我还以为你找的全套流程呢。
我连vim都没碰过,平时都是gedit,只有自动缩进一项功能,还很弱智,帮不上你了
这儿一点参考资料,贴出来,虽然有可能用不上
http://www.ibm.com/developerworks/cn/linux/l-assembly/
‘叁’ LINUX下面进行8086汇编
编辑器就是普通的编辑器,vim,emacs,gedit,kate...都可以
源文件类型为ascii码的plain
text
c/c++,asm,perl,python,vhdl...我所接触过的编程语言都是以plain
text作为源文件的
编译用gcc或者nasm,前者编译AT&T汇编,后者编译intel汇编
8086的教材上一般都是用intel,不过区别不大,可以相互转化
链接就是ld,属于gcc工具集
nasm如何链接,没试过
和C一样也是使用VIM(或者其他编辑器),不用加参数,不用配置环境(如果你不想让vim和emacs使用起来更舒服的话,根本不用配置,配置一下仅仅是为了提高打字效率)
编译器会自动根据plain
text的文件内容来编译
这和windows下的编程没有区别,只不过visual为了"用户友好"把编译的本质隐藏起来了
如果实在不爽,装dosemu,dos虚拟机,一般8086汇编都是用dos的吧,debug,masm都有
‘肆’ 如何定位 linux源代码 汇编语言 符号
linux下将C语言编译为汇编代码,需用-S参数:编译命令为:$ gcc -S s1.c如下代码:<pre t="code" l="cpp">void fun(int a,int b)
{
/*这个函数什么也不做*/
}
int main(void)
{
fun(100,200);
return 0;
}
‘伍’ 有没有懂linux内核源码中的汇编代码的#define switch_to(n){struct {long a, b;}__tmp; __asm__("cmpl "
用的at&t汇编,也就是Linux下的汇编语言,跟Intel x86汇编翻译成i386指令是一样的,就是写法和符号不同。
里面应该是__asm__()后面跟的是一个字符串,包含大量转义字符,你把转移字符翻译成对于的格式再看.
‘陆’ Linux系统里如何编译汇编程序。
linux 编译汇编程序常用的有两种,一种是A&T方式的,你gcc 就可以编译了。还有一种是80X86方式,一般是用NASM,NASM你要在安装LINUX时就要添加软件包,或者你进入图型界面,增加NASM软件包,就可以编译了。
‘柒’ 电脑装了虚拟机linux如何写汇编代码,纯小白提问
linux可以使用shell来编写代码
当你登录至shell之后。
可以使用输入vim XXX.sh或者为XXX(XXX代表名字)。当你输完之后你就会进入编写代码的界面,进入之后必须按个小a才能编写(⊙o⊙)哦(左下角有提示的)。
当你编写完后按键盘左上角的ESC退出编辑模式,随后在按shift+:键,在输入wq就是保存退出咯(w是保存,q是退出)
如果想运行编写的代码在shell界面输入命令:
bash XXX或者XXX.sh
‘捌’ linux 汇编工具以及调试
当然是
gcc
+
gdb
不过gcc/gdb
用
AT&T
风格的汇编,和
dos/win32
下的
Intel
风格不太一样,你要去了解一下具体区别。
.s
文件表示汇编源码文件,
可以用gcc
编译,比如
gcc
-g
a.s
-o
a.exe
然后就可以用
gdb
a.exe
来调试了,用
print
$eax
来显示
eax
寄存器,等等。
具体
gdb
命令自己搜索了解一下。
下面给个入门例子,把下面代码存入
a.s
,
就可以在
linux
下用我上面说的方法编译和调试了:
hello:
.string
"Hello
world\n"
.globl
main
main:
movl
$4,
%eax
movl
$1,
%ebx
movl
$hello,
%ecx
movl
$12,
%edx
int
$0x80
ret
‘玖’ linux内核代码 汇编部分 疑问
没研究过。
不过我记得 Linux 内核其实是两部分,真正的内核本体是在内核文件的后部,一般都是压缩的。之前是一个这个架构通用的启动代码,应该就是你这个汇编。
bootloader 的作用是把内核读取到指定地址,之后运行这个内核,这样运行的恰恰就是这段汇编写的启动代码,这个启动代码的作用就是初始化环境,之后把后面本体的内核解压缩并且写到内存开始部分(忘了叫什么名字)正好盖掉 bootloader ,并且继续运行。这样这个运行的内核才是最终的 Linux 内核。(至少 x86 是这样)
但每个 CPU 架构的启动过程又有不同的地方。应该每个 CPU 都有自己特定的头部启动代码。
你说这三个文件应该是有不同目的的。compressed 应该是解压用的,kernel 里面的应该是执行主要启动过程的。那个 common.s 应该是“通用”部分代码模块。我的 comperssed 里面还有很多 lzma 、gzip 、lzo 以及一些设备名称的东西,应该都是“模块”一类的吧。
你看看 Makefile 的编译过程应该就能开除编译调用的文件都是什么了。
还有,你看源代码最好看原版的,如果使用,那就去用针对性的。不然赶上找抽的人,可能针对某个开发板的代码,会因为太过针对而不符合通用的一些规定或者习惯。