AOJでアセンブリ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

AOJでアセンブリ

#1

投稿記事 by みけCAT » 13年前

AIZU ONLINE JUDGEでアセンブリが使えないか試しています。
試しにX Cubicを解こうとしているのですが、Runtime Errorになってしまいます。
これがまずローカルで書いたコードです。

コード:

#include <stdio.h>

asm(
	"_solve:\n\t"
	"pushl %ebp\n\t"
	"movl %esp,%ebp\n\t"
	"andl $-16,%esp\n\t"
	"subl $20,%esp\n\t"
	"movb $37,8(%esp)\n\t"
	"movb $100,9(%esp)\n\t"
	"movb $0,10(%esp)\n\t"
	"leal 8(%esp),%eax\n\t"
	"movl %eax,(%esp)\n\t"
	"leal 12(%esp),%eax\n\t"
	"movl %eax,4(%esp)\n\t"
	"call _scanf\n\t"
	"movl 12(%esp),%eax\n\t"
	"mull %eax\n\t"
	"imull 12(%esp),%eax\n\t"
	"movb $10,10(%esp)\n\t"
	"movb $0,11(%esp)\n\t"
	"movl %eax,4(%esp)\n\t"
	"call _printf\n\t"
	"movl $0,%eax\n\t"
	"leave\n\t"
	"ret\n\t"
);
extern int solve(void);

int main(void) {
	return solve();
}
これをそのままAOJに渡すとコンパイルエラーになってしまったので、少し修正したところRuntime Errorが出ました。
試行錯誤しても、Runtime Errorが消えませんでした。
最後にこれを提出したのですが、もうどこを直すべきかわかりません。

コード:

#include <stdio.h>

asm(
	"solve:\n\t"
	"pushq %rbp\n\t"
	"movq %rsp,%rbp\n\t"
	"andq $-16,%rsp\n\t"
	"subq $32,%rsp\n\t"
	"movb $37,16(%rsp)\n\t"
	"movb $100,17(%rsp)\n\t"
	"movb $0,18(%rsp)\n\t"
	"leaq 16(%rsp),%rax\n\t"
	"movq %rax,(%rsp)\n\t"
	"leaq 20(%rsp),%rax\n\t"
	"movq %rax,8(%rsp)\n\t"
	"call scanf\n\t"
	"movl 20(%rsp),%eax\n\t"
	"mull %eax\n\t"
	"imull 20(%rsp),%eax\n\t"
	"movb $10,18(%rsp)\n\t"
	"movb $0,19(%rsp)\n\t"
	"movl %eax,8(%rsp)\n\t"
	"call printf\n\t"
	"movl $0,%eax\n\t"
	"leave\n\t"
	"ret\n\t"
);
extern int solve(void);

int main(void) {
	return solve();
}
どこかを修正すれば通るのでしょうか?
それともAOJでアセンブリを使用することは不可能なのでしょうか?
よろしくお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

たいちう
記事: 418
登録日時: 15年前

Re: AOJでアセンブリ

#2

投稿記事 by たいちう » 13年前

> それともAOJでアセンブリを使用することは不可能なのでしょうか?

なぜ主催者に問い合わせないのですか?

私が主催者の立場を憶測すると、アセンブリを含むプログラムはサイトの趣旨に
沿わないと判断し、セキュリティ上の不安からasmは許可しません。
悪意のある人が作ったプログラムを自分のサーバーで動かす可能性もあるのですから、
リスクを下げたいと思います。

当然、実際の主催者の考えは私と大きく違う可能性があり、
正しく使えばアセンブリを含むプログラムも動くのかもしれませんが、
みけCATさんの意図は何なのですか?
アセンブリの練習?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: AOJでアセンブリ

#3

投稿記事 by みけCAT » 13年前

たいちう さんが書きました:> それともAOJでアセンブリを使用することは不可能なのでしょうか?

なぜ主催者に問い合わせないのですか?
アセンブリが許可されていないのであればコンパイルエラーになると予想したからです。
質問しました。
http://judge.u-aizu.ac.jp/onlinejudge/t ... p?tid=1144
たいちう さんが書きました:みけCATさんの意図は何なのですか?
アセンブリの練習?
そうです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: AOJでアセンブリ

#4

投稿記事 by みけCAT » 13年前

このコードでAcceptedになりました。
AOJでは関数の引数をスタックではなくレジスタに積まないといけないようですね…

コード:

#include <stdio.h>

asm(
	"solve:\n\t"
	"pushq %rbp\n\t"
	"movq %rsp,%rbp\n\t"
	"andq $-16,%rsp\n\t"
	"subq $32,%rsp\n\t"
	"movb $37,16(%rsp)\n\t"
	"movb $100,17(%rsp)\n\t"
	"movb $0,18(%rsp)\n\t"
	"leaq 16(%rsp),%rax\n\t"
	"movq %rax,%rdi\n\t"
	"leaq 20(%rsp),%rax\n\t"
	"movq %rax,%rsi\n\t"
	"call scanf\n\t"
	"movl 20(%rsp),%eax\n\t"
	"mull %eax\n\t"
	"imull 20(%rsp),%eax\n\t"
	"movb $10,18(%rsp)\n\t"
	"movb $0,19(%rsp)\n\t"
	"movl %eax,%esi\n\t"
	"leaq 16(%rsp),%rax\n\t"
	"movq %rax,%rdi\n\t"
	"call printf\n\t"
	"movl $0,%eax\n\t"
	"leave\n\t"
	"ret\n\t"
);
extern int solve(void);

int main(void) {
	return solve();
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る