こんにちは。
早速ですが、Cプログラムを68000アセンブラに変換できるツール・コンパイラがありましたら知っている方、教えてください。

よろしくおねがいします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

SHARPのX68000というマシンがあって、


このエミュレータがWindows用を含めいくつか存在します.
また、動作に必要なBIOS ROM,OSにCコンパイラ、アセンブラまで
無償公開されています。

このSHARP製Cコンパイラはアセンブラのコードを出力します。
参考URLにWindowsで動作するエミュレータとROM,ソフトがあります。

参考URL:http://www.ksky.ne.jp/~yamama/emul/index.htm
    • good
    • 0
この回答へのお礼

お返事ありがとうございました。
ちょっとインストールが難しそうなのですがやってみたいと思います。

お礼日時:2001/12/12 00:07

対応しているプラットフォームの多さ、という意味では gcc に適うものはないでしょうね。



アセンブルコードが見られるだけで良いのでしょうか、それとも、実際に実行も
してみたいのでしょうか。

68000 が乗っているマシンは持っていないんでしょうね、きっと。

参考URLには、FreeBSD 上で、エミュレータを使った開発・実行環境を構築するとき
の手順が載せてあります。参考まで。

参考URL:http://brain.is.kyushu-u.ac.jp/~inouetom/asm-exp/
    • good
    • 0

プラットホームが指定されていないのですが…



とりあえずgccの-Sオプションって言うのはダメですか?

参考URL:http://www.gnu.org/software/gcc/gcc.html

この回答への補足

すいません。説明がかなり不足していました。

OSはWindows98 SE
またはKondara Linuxです。
どちらかでできればいいと思ってます。

gcc の -S オプションでできるアセンブラコードは68000アセンブラでは無いと思われます。

補足日時:2001/12/10 11:39
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCASL アセンブラ命令 アプリ機能

例えば、CASLのアセンブラ命令にDCがある。
LABER DC 100 とすると。
これは、メモリに領域を確保し100をいれる命令だが、プログラムが変更されれば、メモリアドレスは変更される。

CASLには機械語命令・マクロ命令・アセンブラ命令がある。

機械語命令は人に分かりやすいようにニーモニックが付けられているだけだが、
アセンブラ命令はプログラムが変更されればそのアドレスは移動するという、ハンドアセンブリでは、できない機能が含まれている。

アセンブリ言語は色々ありますが、アセンブラ言語は人に見やすいようにニーモニックが付けられているだけでなく、CASLのDC命令のように、ハンドアセンブリではできないアドレスの自動変更のようなアプリケーションとしての機能(OS的機能)も一般にふくまれているとかんがえてよいのでしょうか?

よろしく願います。

Aベストアンサー

No1です。

>プログラムの変更==>DCでアドレスの自動変更

DC命令に限らず、命令につけられたアドレスが何番地であるかを計算(カウントアップ)するのは、アセンブラの基本機能です。これがないと、生成した機械語命令を何番地に格納したらいいのかわからない。

>という、アセンブラ言語が単にニーモニックの記述だけでない、アプリとしての機能(OS的機能)が含まれているかという質問です。

アセンブラはアプリなので、ニーモニックを解釈したり、上記のアドレスの計算をしたりするのは、アセンブラというアプリの機能です。OSは関係ありません。OSの上でアセンブラというアプリが動いているだけ。

>LABER DC 100 とすると。
>これは、メモリに領域を確保し100をいれる命令だが、プログラムが変更されれば、メモリアドレスは変更される。

もしかして勘違いがあるかもしれませんが、
LABER DC 100
というのは、
「LABERという名前のラベルを現在の命令格納アドレスポインタの値で定義して、そのアドレスの1ワードに100を入れて、命令格納アドレスポインタを+1する」
で、
LABEL NOP
という機械語命令は、
「LABELという名前のラベルを現在の命令格納アドレスポインタの値で定義して、そのアドレスの2ワードにNOPの命令コードを入れて、命令格納アドレスポインタを+2する」

と、いうことで、DC命令と機械語命令はアセンブラの動作(ソースファイルをアセンブルして命令コードファイルを作る際の動作)としては格納するデータがちょっと違うだけです。DS命令も、データの長さが1とか2でなく可変であることと、データに何が入るか分からないというくらいの違いだけです。

No1です。

>プログラムの変更==>DCでアドレスの自動変更

DC命令に限らず、命令につけられたアドレスが何番地であるかを計算(カウントアップ)するのは、アセンブラの基本機能です。これがないと、生成した機械語命令を何番地に格納したらいいのかわからない。

>という、アセンブラ言語が単にニーモニックの記述だけでない、アプリとしての機能(OS的機能)が含まれているかという質問です。

アセンブラはアプリなので、ニーモニックを解釈したり、上記のアドレスの計算をしたりするのは、アセンブラとい...続きを読む

QBorlandを使ってCプログラムをコンパイラしようとしてあるプログラ

Borlandを使ってCプログラムをコンパイラしようとしてあるプログラムを実行すると、
「Warning W8053 se.c 26: 'sleep(unsigned int)' is obsolete in function main」
とでました。これってどういう意味ですか?具体的にお願いします!!

Aベストアンサー

実行しようと…ではなく、コンパイルしようとすると…では?
# 「コンパイラしようと」というのもおかしな表現ですが。

「W8053」でググったら…
http://2ch.ac.la/read.php/tech/1187213990/794-993
が。(800番で見つかります)

英語ですが
http://forums.techguy.org/software-development/220086-c-sleep-obsolete-so-whats.html
というのも。

sleep()という関数は古いタイプだから使用しない方がイイよ。
って感じの警告でしょう。

あるプログラムとやらがどんなモノか不明ですので、その程度までですかね。
# 英語のページのヤツは、Sleep()というWindowsAPIの使用を勧めていますね。

Qアセンブラの擬似命令について

kigin と申します。
アセンブラの擬似命令に「align」というものがありますがこれは一体どういう意味なのでしょうか?
また、アセンブラの擬似命令やアセンブラプログラミングに関して詳しいガイダンス的な紹介がなされているホームページ等がありましたら、教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

CPUによっては2バイト分を読み書きしたりする(ワードアクセス)のときは
アドレスは偶数アドレスでなければならないとかあるCPUがあってそのときに
align 2としてもしそのデータがそのまま奇数アドレスにおくこと
になりそうなときにちゃんとダミーデータをおいて偶数アドレスから
はじめてくれるものです。

良く使うのはIntel系CPUは2バイト境界がいいとか4バイト境界が早いとかで
やります

QC言語初心者で早速詰まってしまいました。 C言語の計算についてでちょっと良く分からないです… #in

C言語初心者で早速詰まってしまいました。


C言語の計算についてでちょっと良く分からないです…

#include<stdio.h>

int main(void)
{
int a,b,x,s,c;
printf(″A=″);
scanf(″%d″,&a );
printf(″B=″);
scanf(″%d″,&b);
printf(″X=″);
scanf(″%d″,&x) ;

//和sはa,b,xの合計を2で割った余り
s=();
//桁上げcはa,b,xの合計を2で割った商
c=();
printf(″s=%d c=%¥n″,s,c,);
return 0;


}


というもので余りと商を求める問題です
この場合余りの求め方が(a+b+x)%2商の求め方が(a+b+x)/2だと思うんですが、実行してもエラーが出て来てしまいなにがなんだかわからなくなってしまいました。なにが違うんでしょうか?
良くわかりません、何方かわかりやすく教えていただけると助かります。

C言語初心者で早速詰まってしまいました。


C言語の計算についてでちょっと良く分からないです…

#include<stdio.h>

int main(void)
{
int a,b,x,s,c;
printf(″A=″);
scanf(″%d″,&a );
printf(″B=″);
scanf(″%d″,&b);
printf(″X=″);
scanf(″%d″,&x) ;

//和sはa,b,xの合計を2で割った余り
s=();
//桁上げcはa,b,xの合計を2で割った商
c=();
printf(″s=%d c=%¥n″,s,c,);
return 0;


}


というもので余りと商を求める問題です
この場合...続きを読む

Aベストアンサー

>エラーが出て来てしまい

どんなエラーか書かないと誰も分かりません。

Q[GNUインラインアセンブラ] SIMD命令

下記のようなGNUインラインアセンブラを含むプログラムをMac Book Airにてgccでコンパイルして実行するとPSUBSW命令は、mm0 - mm1の結果がmm0に入りますが、IntelのDevelopper's manualのPSUBSW命令の説明においては、mm1-mm0の結果がmm1に入るとなっています。

これは、なぜなのでしょうか。

---- Begin source code -----
1 #include <stdio.h>

2

3 int

4 main()

5 {

6 short int a[4] = {1111,1112,1113,1114};

7 short int b[4] = {1111,2112,3113,4114};

8 short int c[4];

9

10 asm volatile (

11 "movq (%1),%%mm0\n\t"

12 "movq (%2),%%mm1\n\t"

13 "psubsw %%mm1,%%mm0\n\t"

14 "movq %%mm0,%0\n\t"

15 "emms"

16 : "=g"(c): "r"(&a),"r"(&b));

17

18 printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);

19

20 return 0;

21 }
---- End source code -----

Intel developper's manual (http://www.intel.co.jp/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf)

PSUBSW mm, mm/m64
Subtract signed packed words in mm/m64 from signed packed words in mm and saturate results.

下記のようなGNUインラインアセンブラを含むプログラムをMac Book Airにてgccでコンパイルして実行するとPSUBSW命令は、mm0 - mm1の結果がmm0に入りますが、IntelのDevelopper's manualのPSUBSW命令の説明においては、mm1-mm0の結果がmm1に入るとなっています。

これは、なぜなのでしょうか。

---- Begin source code -----
1 #include <stdio.h>

2

3 int

4 main()

5 {

6 short int a[4] = {1111,1112,1113,1114};

7 short int b[4] = {1111,2112,3113,4114};

8 short int c[4];

...続きを読む

Aベストアンサー

詳しくないのですが、アセンブラの書式にはAT&T式とIntel式があり、オペランドのソースとデスティネーションが逆のようです。

QVisual C++ 2008で .cファイルのコンパイラができない

現在Microsoft Visual C++ 2008 Express Editionでc言語を勉強していて
今の所しばらくc++の勉強をする予定はありませんので、
c言語のみ勉強したいのですがVisual C++ 2008で、.cファイルを作成し、
これをコンパイルしようとすると必ずエラーが出ます。

原因を色々なページを回って探したのですが
「.cppファイルにすればコンパイルできます」という回答しか見当たりません

c言語でも最初のうちは.cppファイルでも問題なく動くようですが、
高度なレベルに行くとcpp独自のエラーが出ると聞いております。

このような状態でc言語を勉強するのも微妙です
なんとか.cファイルでコンパイラする方法は無いでしょうか?

あるいはVisual C++ 2008に代わるお勧めのソフトでも結構です
よろしくお願いします。

Aベストアンサー

プロジェクトのプロパティの
構成プロパティ
 C/C++
  詳細
の、「コンパイル言語の選択」を「Cコードととしてコンパイル(/TC)」にしてみてもだめでしょうか?

Q8086アセンブラで、メモリ間のデータをストリング命令でブロック転送したい

ソースが長めなので、簡潔に書きます。ご無礼の段、ご容赦ください。
【目的】PC-9801本体のCバス(汎用拡張スロット)に挿したサウンドボード上の
ROM BIOSを読み出し、バイナリファイルに落としたい。既にエミュレータ用に実機からの
吸出しツールは存在するが、ソースが無いので、自作することにした。
その前段階としてアセンブラの修行も兼ねて、ROM BIOSの先頭3ワード(6バイト)を
メモリ上のバッファにコピーし、比較して値の合致を確認したい。
将来的にはSCSI ROM BIOSの解析等を試みたい。

【方針】8086のストリング命令でダイレクトにメモリtoメモリでブロック転送を
する。具体的にはrep movsbを用い、6バイトを転送する。

【備考】PC-9801-26K互換音源のROM BIOS(少なくとも先頭8バイト)は一意であり、
その並びは、0001h, 0000h, 00d2h である。例外はありません。
86音源でも同様で、下位互換性があることは、拙作ツール(OPNCHK.COM)にて確認済み。
なお、上記バイト列は、セグメントCC000h:オフセット2E00hから読み出し
可能である。
なお実行にあたり、所謂メモリマネージャの類(MELEMM.386等)は一切
組み込まない状態で行なう(EMSメモリマネージャ等との同居対応は将来の課題とします)。

【開発環境】PC-9801DA2(Cyrix Cx486DLC-25MHzに載せ換え; 13.6MB RAM; HA-55BS4 SCSIボード
+ 240MB SCSI HDD + SONY CPD-17SF9 CRT
+ NASM 2.06rc10 on NEC DOS 5.0A-H + Turbo Debugger v3.2 と、
秋葉で買ったジャンクFDに入ってたMASM ver 3.00;
予備機 VX41/RS21/EPSON 286VF/EPSON 486HX2/Xv13R16[K6-2 400MHz]/
AT互換機上のNekoIIエミュ/Cygwin上のnasmw.exe)

【参考書】PC-98、8086アセンブラ、テクニカルデータ、古雑誌等 定番本100冊ほど

【拙作コードの失敗点をご指南いただきたい。NASMコードですが、MASM/TASMでも構いません】
; PC-9801-26K compatible Sound ROM BIOS Copy Program (i/o address 0188h)
; Programmed by OrzHacker666
; Date 2009-07-13 for NASM 2.06rc10

[Bits 16]
org 100h ; COM program
section .text
start:
push es ; これを保存しないと、
push ds ; 画面がめちゃくちゃになる

mov ax, 0cc00h ; Sound ROM セグメントアドレス
mov es, ax
mov ds, ax ; DS:SI -> ES:DI 無意味か?
mov bx, 2e00h ; Sound ROM オフセットアドレス

lea si, [es:bx] ; ES:BX がSound ROMの開始点
lea di, [ds:sbuff] ; sbuffは仮に確保したバッファ。
; どこにあるかは、当たり前ですが、不明。そこら辺はCの変数宣言と同じですが。

mov cx, 8 ; とりあえず、アタマ8バイトをコピー
cld
rep movsb

CompareWithOriginal:
cmp word [es:bx+4], 00d2h ; これは通る。当たり前。
jne FailedCpyRom
cmp word [ds:sbuff+4], 00d2h ; ここで失敗判定。なぜ?
jne FailedCpyRom
; sbuffにes:bx~が正しく
; 転送されていないのか?
SuccessCpyRom: ; これを拝めれば…。
pop ds
pop es
mov ah, 9
lea dx, [SUCCESSMsg]
int 21h
mov ax, 4c00h
int 21h

FailedCpyRom: ; 見飽きましたOrz
pop ds
pop es
mov ah, 9
lea dx, [FAILEDMsg]
int 21h
mov ax, 4c00h
int 21h

section .data
SUCCESSMsg:
db 'Succeeded !!', 0dh, 0ah, '$'
FAILEDMsg:
db 'Failed(--;)', 0dh, 0ah, '$'

section .bss
sbuff:
resb 8 ; Cで書くと、差し詰め unsigned char sbuff[8]; であろうか…。

識者の方、よろしくお願いいたします。気になって夜も眠れません。

ソースが長めなので、簡潔に書きます。ご無礼の段、ご容赦ください。
【目的】PC-9801本体のCバス(汎用拡張スロット)に挿したサウンドボード上の
ROM BIOSを読み出し、バイナリファイルに落としたい。既にエミュレータ用に実機からの
吸出しツールは存在するが、ソースが無いので、自作することにした。
その前段階としてアセンブラの修行も兼ねて、ROM BIOSの先頭3ワード(6バイト)を
メモリ上のバッファにコピーし、比較して値の合致を確認したい。
将来的にはSCSI ROM BIOSの解析等を試みたい。

【方針...続きを読む

Aベストアンサー

>回答中の、"cmp word es:[di-4], 00D2h"は
MOVSD×2でDIはsbuff+8を指しています。DI-4はsbuff+4のことです。
これくらいはアセンブラをやる以上、直ぐに分かってください。

>sbuff自体については、セグメント値は不定で、調べる意義は無い
ちょっと乱暴な話ですね。sbuffはbss(初期値なし静的領域)のよう
なので、実行時のDSです。

確実なのはtextセグメント(コードと同じ)に次のようにデータを
定義して使います。
LES  DI,CS:adr 'ES:DIにsbuffのセグメント:オフセットが入る
== 中略 ==
adr  DD sbuff 'sbuffのセグメント:オフセットが記録される

>DS=ESではダメです
だって、そうなっていますよ。AXをDSにもESにもMOVしてます。
前にも書いたんですが、セグメントの使い方が分かっていない?

前のサンプルは上記仮定(sbuffは実行時DSにある)で作っています。
PUSH DS、POP ES ES←DSにしています。(受け取り側が実行時DS)
この後で、DSに0CC00hを代入しています。

>[es:]のオーバーライドは必須です
CMP   WORD ES:[DI-4],00D2h
ちゃんと、ESでオーバライドしてるはずですけどね。

>ジレンマに陥ります
どこがでしょう?アセンブラで、セグメントレジスタを使う以上は
自分の自由に使えば良い訳で、適当に値を設定したり、戻したりすれば
済む話なのでは?
例:
REP  MOVSB
PUSH  DS
PUSH  ES
POP   DS
POP   ES
後の4命令で、DSは実行時DSに戻り、ESはROMセグメントを指します。
サンプルではこれをやっていないので、実行時DSはESにある状態です。
故にセグメントオーバーライドしています。

>回答中の、"cmp word es:[di-4], 00D2h"は
MOVSD×2でDIはsbuff+8を指しています。DI-4はsbuff+4のことです。
これくらいはアセンブラをやる以上、直ぐに分かってください。

>sbuff自体については、セグメント値は不定で、調べる意義は無い
ちょっと乱暴な話ですね。sbuffはbss(初期値なし静的領域)のよう
なので、実行時のDSです。

確実なのはtextセグメント(コードと同じ)に次のようにデータを
定義して使います。
LES  DI,CS:adr 'ES:DIにsbuffのセグメント:オフセットが入る
== 中略 ==
...続きを読む

Q現在、C/C++ で作成したプログラムを C# に移植しているのですが

現在、C/C++ で作成したプログラムを C# に移植しているのですが
基本的な部分が分からずに困っています。

C# のバイト配列に対し、C/C++ で言う memmove 関数を行う方法
が知りたいのです

C/C++ で下記のような事を
char a[] = {1,2,3,4,5};
char b[5];
memset( b,0x00,sizeof(b));
memmove( &b[2], &a[3],2);

C# のバイト配列でやる場合
byte[] a = { 1, 2, 3, 4, 5 };
byte[] b = new byte[5];
memmove( &b[2], &a[3], 2);
memmove の部分はどのようにして行うのでしょうか?

Aベストアンサー

Array.Copy( a, 2, b, 3, 2);

のような感じでできると思います。

Q自分でアセンブラ言語を作れる?

自分でアセンブラ言語を作れる?
あるCPUにmov命令というのがありますが命令名をソフトウェアレベルで変えることは
出来るのでしょうか?
(mov ax,1をmove ax,1にしたり)
アセンブラはCPUが同じならどれも同じだと思っていたのですが
プログラムを終了する時、windowsはint 21hなのにlinuxはint 0x80なので
疑問に思いました。

Aベストアンサー

> windowsはint 21hなのにlinuxはint 0x80なので
これはアセンブリ言語の問題ではなくAPIの問題です。
intはソフトウエア割り込み命令でBIOSやAPIを呼び出すのに使います。
同じような機能でもWindowsやLinuxなどのOSが違えば呼び出しアドレスが違うのは当然です。

> アセンブラはCPUが同じならどれも同じだと思っていたのですが
アセンブリ言語のニーモニクはCPUメーカーが同じなら同じです。
が、CPU毎に同じなのはマシン語であってアセンブリ言語のニーモニクではありません。
例えばインテル8080とザイログZ80はマシン語レベルで高い互換性がありますがアセンブリ言語のニーモニクは大きく異なります。
最終的にマシン語コードが出来上がればニーモニクはmov ax,1でもmove ax,1でもax=1でも関係ありません。

QWinAPIに用いるコンパイラコンパイラ

私はウィンドウズのアプリケーションを作るのに、Visual StudioのC++を用いてます。これに簡単なスクリプトファイルを加えてグラフィックを作成しようと考えていますが、そのスクリプトを解析するのにコンパイラコンパイラを勉強を兼ねて使用しようと思いました。

コンパイラコンパイラには沢山種類があるかと思われます。私が思いつくのは、boostや、yacc/lexです。

この環境でコンパイラコンパイラをソースとして加えるのなら皆さんなら何を用いますか。出来れば理由も加えて教えてください。ちなみに、コンパイラコンパイラを勉強したいので、簡単にできる文字を取り組んで比較と言った事以外でお願いします。

Aベストアンサー

ライセンスを気にしないなら flex/bison が普通?
あるいは antlr?


人気Q&Aランキング

おすすめ情報