注册 登录
编程论坛 Linux教室

linux & masm

有容就大 发布于 2012-09-04 21:56, 3074 次点击
我想在linux下搞汇编的工作 目前虚拟的ubuntu里已经安装好了 vim和emacs
曾经在里面写了个简单的正确的assembly程序 但是不会编译运行
问一下大牛们 还要下载安装什么软件吗?
25 回复
#2
信箱有效2012-09-04 21:59
都给我吧。

#3
信箱有效2012-09-04 22:02
折腾吧。
masm的第一个字母M,你知道是什么意思吗
#4
zklhp2012-09-04 22:03
macro

睡觉了 蹭点分
#5
zklhp2012-09-04 22:05
以下是引用zklhp在2012-9-4 22:03:22的发言:

macro

睡觉了 蹭点分

我开始觉得是microsoft 后来一想不对啊 应该是macro

一查 原来是 Microsoft Macro Assembler (MASM)
#6
zklhp2012-09-04 22:05
nasm fasm 都很好

JWasm 支持MASM的那些宏哦

可惜 都没用过。。
#7
有容就大2012-09-04 22:17
网上推荐GAS和NASM 不过GAS使用的是AT&T语法 NASM要区分大小写~~
#8
madfrogme2012-09-04 23:00
as 也可以,好像适合AT&T语法的
#9
pangding2012-09-05 00:05
回复 8楼 madfrogme
现在的 as 一般就是 gas。和 cc 是 gcc 一个道理。
#10
pangding2012-09-05 00:06
z版说 gas 已经支持 intel 的语法了,有容何不自己试试:
$ as -o xxx.o xxx.s
$ ld xxx.o
$ ./a.out
应该就行了。
#11
madfrogme2012-09-05 00:08
回复 9楼 pangding
原来如此
#12
pangding2012-09-05 00:08
以下是引用zklhp在2012-9-4 22:05:08的发言:


我开始觉得是microsoft 后来一想不对啊 应该是macro

一查 原来是 Microsoft Macro Assembler (MASM)

我的第一感觉也是 microsoft。
#13
pangding2012-09-05 00:10
有容最好去 software center 把 gcc 呀 g++ 之类的都先装好。默认带不带我也不记得了,反正肯定是必备工具。
#14
zklhp2012-09-05 08:06
以下是引用pangding在2012-9-5 00:06:36的发言:

z版说 gas 已经支持 intel 的语法了,有容何不自己试试:
应该就行了。
as --help

有类似这样的东西

 -mmnemonic=[att|intel]  use AT&T/Intel mnemonic
 -msyntax=[att|intel]    use AT&T/Intel syntax

肯定是支持的啦 不过得加参数
#15
有容就大2012-09-05 09:36
以下是引用pangding在2012-9-5 00:10:37的发言:

有容最好去 software center 把 gcc 呀 g++ 之类的都先装好。默认带不带我也不记得了,反正肯定是必备工具。
恩 这个主意好。
#16
有容就大2012-09-05 09:37
回复 14楼 zklhp
如果GAS支持intel语法 就先用它了
#17
有容就大2012-09-05 11:46
网上说 在intel语法里的代码前加上.intel_syntax就可以用AS编译这个汇编源文件
但是 我试了下不行啊  改成 intel syntax / intel_syntax 都不行
yrjd@yrjd-virtual-machine:~/c$ as 11.s -o 11.o
11.s: Assembler messages:
11.s: Warning: end of file not at end of a line; newline inserted
11.s:1: Error: unknown pseudo-op: `.intel'
11.s:2: Error: no such instruction: `assume cs:code,ds:data'
11.s:4: Error: no such instruction: `data segment'
11.s:5: Error: no such instruction: `s db 72ello world!4410h,13h,36'
11.s:6: Error: no such instruction: `data ends'
11.s:8: Error: no such instruction: `code segment'
11.s:9: Error: too many memory references for `mov'
11.s:10: Error: too many memory references for `mov'
11.s:11: Error: junk `h' after expression
11.s:11: Error: operand size mismatch for `int'
11.s:13: Error: too many memory references for `mov'
11.s:14: Error: junk `h' after expression
11.s:14: Error: operand size mismatch for `int'
11.s:15: Error: too many memory references for `mov'
11.s:16: Error: junk `h' after expression
11.s:16: Error: operand size mismatch for `int'
11.s:17: Error: no such instruction: `code ends'
11.s:18: Error: no such instruction: `end start'
然后按照Z版给的那个方法去试 也不行
yrjd@yrjd-virtual-machine:~/c$ -msyntax=[intel]
-msyntax=[intel]: command not found
yrjd@yrjd-virtual-machine:~/c$ -msyntax=[att|intel]
intel]: command not found
-msyntax=[att: command not found
怎么弄 ?
直接学at&t 语法算来?


#18
madfrogme2012-09-05 11:55
为了免去各种麻烦,感觉用intel语法, 就用nasm 编译
AT&T 语法,就用 gas编译,

因为接触汇编不多,我一直是这么做的,顺便付一个可编译的AT&T 语法的 hello,world

程序代码:
.global _start
_start:
    jmp    do_call
jump_back:
    xor %eax, %eax
    xor %ebx, %ebx
    xor %ecx, %ecx
    xor %edx, %edx
    movb $4, %al
    movb $14, %dl
    popl %ecx
    movb $1, %bl
    int    $0x80

    xor %eax, %eax
    movb $1, %al
    xor %ebx, %ebx
    int $0x80

do_call:
    call    jump_back
hello:
    .ascii "Hello, World!\n"


$ as hello.s -o hello.o

$ ld hello.o -o hello
#19
有容就大2012-09-05 12:02
回复 18楼 madfrogme
为了免去各种麻烦,感觉用intel语法, 就用nasm 编译
AT&T 语法,就用 gas编译。

好吧 就听你的

不过我在网上看到个AT&T写的Hello world的代码 直接调用的系统内核  代码很短啊 没有跳转。
#20
madfrogme2012-09-05 12:15
以下是引用有容就大在2012-9-5 13:02:28的发言:

为了免去各种麻烦,感觉用intel语法, 就用nasm 编译
AT&T 语法,就用 gas编译。

好吧 就听你的

不过我在网上看到个AT&T写的Hello world的代码 直接调用的系统内核  代码很短啊 没有跳转。

恩,是的,这时为了写 shellcode 之前,用了一点点需要在shellcode用到的技巧吧

比如消灭NULL, 把字符串放在call 下面为了把字符串的地址推入栈,什么的

[ 本帖最后由 madfrogme 于 2012-9-5 13:20 编辑 ]
#21
newdos2012-09-05 12:40
熟悉intel语法,可以使用nasm,这个是多数程序员的选择,随大众吧。
#22
有容就大2012-09-05 13:02
回复 21楼 newdos
好的 去搞搞nasm先

#23
有容就大2012-09-05 15:40
回复 21楼 newdos
nasm 结合 gcc编译 还不错 直接ld有点问题 估计masm和nasm虽然都遵循intel语法 但是源程序应该还是不会一模一样吧
#24
pangding2012-09-06 00:14
以下是引用有容就大在2012-9-5 13:02:42的发言:

好的 去搞搞nasm先

期待你学呀。学好了可以展示一下怎么在 linux 下用 nasm,我好像还没用过。
#25
有容就大2012-09-06 00:38
回复 24楼 pangding
嘿嘿 这个nasm和masm的书写还是很多不一样啊
P版用的是AT&T语法的Gas吧 貌似AT&T更难学啊
#26
pangding2012-09-06 22:26
语法上的区别很有限,我上回在汇编区发的那个 at&t 的 hello world 程序的帖子后面我又给了个链接,几乎总结了所有 at&t 和 intel 语法之间的区别。
也许主要的不同是在系统上吧,你学的好像都是 dos 下的东西。系统不一样,调用系统函数的方法肯定也不一样呗。
1