SH3のマニュアルでは、MOVの表記は、MOV.L@(disp,PC),Rnになっています。
ところが、エミュレータの逆アセンブラの表記は、MOV.L@(xxxx:8,PC),Rn
となっています。xxxxのアドレスから、どのアドレスの値を持ってくるの
でしょうか????

A 回答 (2件)

>逆アセンブラで、1000番地にMOV.L@(0018:8,PC),R15と表記されているとき


>これを実行後、R15の値は、PC+001Cつまり101Cから4バイトがR15に
>入ってしまうのですが、どういう計算なのでしょうか?。
確たる自信をもってはいませんがSHは完全RISCパイプラインアーキテクチャ
のため、1000番地に上記命令があり、これを「実行している」とき既にPCは
2個先の命令のデコードの所にあり1004になっているからではないですか?
1004+0018->101Cということです。
ちなみにSHの遅延分岐は御存知ですか?例えば
MOV#0,R0
BRALABEL
MOV#1,R0
LABEL:
ADD#1,R0
<- この時点でR0は2になる。
これもBRA命令の「実行の時点」でPCは+4されていると考えられない
でしょうか?
# SHでアセンブラ書くのは、これだから嫌~ン。
    • good
    • 0

エミュレータおよびアセンブラの表記によって違いは在るかも知れませんが、


'mov.l @(disp,PC),Rn'は(PC & fffffffc) + disp * 4で求まったアドレスの
内容をRnに入れることです。ここでdispはSHの命令長の関係上8ビット値になり
ます(詳しくは日立のページあたりからデータブックを取ってきてみてください)。
大抵のアセンブラの例を挙げると(インデントが入らないので見づらいですが)、
mov.l@(INDEX,pc),r0
mov.l@r0,r1
- 省略 -
INDEX:
.longTABLE
TABLE:
.long1
とすると、R0にはTABLEのアドレスが入り、R1には1が入ります。
アセンブラが現在PC値からINDEXの相対アドレスを計算してくれるのでその辺は
気にしなくていいです。当然8ビットで届かなければアセンブルエラーになりますが。

この回答への補足

逆アセンブラで、1000番地にMOV.L@(0018:8,PC),R15と表記されているとき
これを実行後、R15の値は、PC+001Cつまり101Cから4バイトがR15に
入ってしまうのですが、どういう計算なのでしょうか?。

補足日時:2001/03/01 12:52
    • good
    • 0

お探しの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的機能)が含まれているかという質問です。

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

QVBAのプログラムで、DIAG = 1# / A(L, L) や R(

VBAのプログラムで、DIAG = 1# / A(L, L) や R(I) = 0# の数字1、0の後についている番号記号#は何を意味しているものでしょうか?

http://www.index-press.co.jp/books/excel/excel-04.pdf

の記事内にあるプログラムで使用されていますが、解説がありません。
調べてみましたがシャープと読まないことぐらいしかわかりませんでした。

どうぞよろしくお願いします。

Aベストアンサー

Pdf拝見しました。
凄く読みづらいプログラムで、どうにか修正したい欲に
かられるわけですが。

ここでいう♯記号などは、「リテラル」というもので型を
暗黙に示すもので、#はDouble型を示すものだと思います。

言語が違いますが仕様が似てますので参考まで。
3-1 変数と定数
 http://msdn.microsoft.com/ja-jp/library/dd314343.aspx
 …真ん中のほう:
 …VB .NET はリテラルのデータ型に応じて、以下のような表記をします(表 3-2)。
 …の明示的な記述方法の列

1♯ はDouble型の1ということになります。
基本的に、Dim i as Double と宣言すれば i はDouble型に決まって
いますので♯は要りませんが。

稀に Dim i as Variant(何でも型)と宣言したとき、i=1#とすると
Double型として明示代入ができます。
とはいえ、変数の中身が訳がわからなくなるので、こんな書き方は
通常はしません。
プログラム文中を判りやすく見せているだけだと思います。


とはいえ、このプログラムは読みづらいです。
変数、配列のインデクサ、ループカウンタなど殆どが英字2文字以下の
意味のない単語変数なので、可読性のよいプログラムクォリティとしては
よろしくないと思います。

Pdf拝見しました。
凄く読みづらいプログラムで、どうにか修正したい欲に
かられるわけですが。

ここでいう♯記号などは、「リテラル」というもので型を
暗黙に示すもので、#はDouble型を示すものだと思います。

言語が違いますが仕様が似てますので参考まで。
3-1 変数と定数
 http://msdn.microsoft.com/ja-jp/library/dd314343.aspx
 …真ん中のほう:
 …VB .NET はリテラルのデータ型に応じて、以下のような表記をします(表 3-2)。
 …の明示的な記述方法の列

1♯ はDouble型の1ということになります。...続きを読む

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

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

Aベストアンサー

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

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

QASP,net,cgi,javascript,php等の技術

ASP,net,cgi,javascript,php等の技術で、Webアプリケーションを開発するに当って
どれで作成したほうがいいですか?

機能としては、顧客管理、掲示板、グラフ表示、データベースアクセス等の機能を使います。

それぞれの言語で作成するあたって、長所と短所を頂けると幸いです。

Aベストアンサー

・ASP
確かに古いですが、まだASPで動いているサイトはけっこうあると思います。性能面はCGIよりはいいのではないでしょうか。
IISでしか動作しないのが欠点です。

・.net
よく知りません。確かに古いASPよりはASP.netの方がいいかもしれ
ません。最近少しみかけるようになりました。
拡張子 aspx のサイトはこの作りですね。

・cgi
効率が悪いのでやめた方がいいと思います。ただ、いまだに一番
よく使われていると思います。自身でサーバが管理できないプロ
バイダのサーバにおくような場合はこれ以外の選択肢はないかも
しれません。

・javascript
通常はクライアント側で使う言語ですが、サーバ側で使うことも
あり得ます。たとえば、ASPでは、VBScriptの代わりにJavaScript
を使うこともできます。使って何のメリットがあるかは、よくわかり
ません。たとえば、ASPではVBScriptを使った方が動作は早いと
思います。

・PHP
よく知りません。

・あとはサーブレット・JSPも候補にあげた方がいいですね。
特に欠点もなく、無難に何でもこなせると思います。

・ASP
確かに古いですが、まだASPで動いているサイトはけっこうあると思います。性能面はCGIよりはいいのではないでしょうか。
IISでしか動作しないのが欠点です。

・.net
よく知りません。確かに古いASPよりはASP.netの方がいいかもしれ
ません。最近少しみかけるようになりました。
拡張子 aspx のサイトはこの作りですね。

・cgi
効率が悪いのでやめた方がいいと思います。ただ、いまだに一番
よく使われていると思います。自身でサーバが管理できないプロ
バイダのサーバにおくよう...続きを読む

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式があり、オペランドのソースとデスティネーションが逆のようです。

Qいったい,,,,.NETって。。。

質問タイトルがあまりにプアでごめんなさい。素人なもんで。。。。。
MS .NETって、端的にいって何ができるの?何が違うの?アプリケーションの開発環境が向上しただけ?例えば、VB6で作ったアプリでは動作不可能だったことが、.NET環境では可能になるとかあるんですか?

あとWinXPの管理ツールをみると、MS.NET Framework1.1 xxxxxがありますけど、何に使うの?

Aベストアンサー

>アプリケーションの開発環境が向上しただけ?

その認識でいいと思います。
開発側からすると大きな違いです。
ユーザのメリットとしては、ソフトの品質が上がり、安くなる。
# 現状はそうでもないか

新しく出来ることは、ノータッチデプロイメントぐらいですかね。

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[TeX,DVI,PS,PDF]

エラーが出て読み込めないepsファイルがあります。
どうすればいいでしょうか?
そもそも「endobj」とは何でしょうか?

** WARNING ** Didn't find "endobj".
** WARNING ** Failed to include image file "./421.eps"
** WARNING ** >>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]
** WARNING ** pdf: image inclusion failed for "421.eps".
** WARNING ** Failed to read image file: 421.eps
** WARNING ** Interpreting special command PSfile (ps:) failed.
** WARNING ** >> at page="17" position="(178.298, 728.302)" (in PDF)
** WARNING ** >> xxx "PSfile="421.eps" llx=16 lly=22 urx=797 ury=986 rwi=7810 "

●GSViewはEncapsulated Postscriptの仕様で定義された「一行が255文字以下」を満たしていないという理由を掲示した上で表示してくれたが、dvioutでは画像は表示されなかった。

●EPSファイルは、VisioのオブジェクトをAdobe Distiller Jにかまして作られたものだと思われる。
ここでエラーが出るせいなのかわからないが
このEPSファイルが貼り付けられたTeXファイルをコンパイルしたDVIではすべて前にある画像(JPEGをjpeg2psでPSに変換して作成)となっている。

こうして出来た(?)dviファイルをdvipdfmxに通して作られたPDFではそれらの画像(同様の方法を用いて作られたPSファイルを含む)は表示されているが、該当エラーが発生した画像は表示されなかった。

エラーが出て読み込めないepsファイルがあります。
どうすればいいでしょうか?
そもそも「endobj」とは何でしょうか?

** WARNING ** Didn't find "endobj".
** WARNING ** Failed to include image file "./421.eps"
** WARNING ** >>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]
** WARNING ** pdf: image inclusion failed for "421.eps".
** WARNING ** Failed to read image file: 421.eps
** WARNING ** Interpreting special command P...続きを読む

Aベストアンサー

>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]

それで確認しましたか?ここが最重要です.
endobj というのは読んで字のごとく,
オブジェクトの終端でしょう.
この手のエラーがでるのはEPSそのものが不正,
もしくはghostscriptがPDFに変換できないということで
はっきりいうとそのEPSに問題があるのです.

dvioutはEPSを表示する際にghostscriptを使うので
dvioutでも画像が表示できないということなら
ますますgsで変換できないものなのでしょう.
(注意:gsで変換できないのと表示できないは別のことです
gsで表示できるものが他の形式に変換できるかは別問題です)

visio由来のEPSはいろいろと問題を起こします.
大抵の場合はフォント周りで問題が発生します.

Ditillerをお持ちならdvipdfmxを使わなければ
うまくいくかもしれません

もしかするとghostscriptのバージョンをあげたりすると
うまくいくかもしれませんが・・・根本的には
EPSそのものを修正するしかありません.

>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]

それで確認しましたか?ここが最重要です.
endobj というのは読んで字のごとく,
オブジェクトの終端でしょう.
この手のエラーがでるのはEPSそのものが不正,
もしくはghostscriptがPDFに変換できないということで
はっきりいうとそのEPSに問題があるのです.

dvioutはEPSを表示する際にghostscriptを使うので
dvioutでも画像が表示できないということなら
ますますgsで変換できないものなの...続きを読む

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でも関係ありません。

QC,C++,VB,Java 各言語の特徴って何ですか?

C,C++,VB,Java これらの各言語の特徴や開発にあたって注意しないといけない点などを教えてください。

■背景
現行のシステムには様々な開発言語が用いられていますが、時々なぜこのシステムを開発するのにこの言語を使ったんだろう?と思うことってありませんか?
私は試行錯誤すればどの言語でも大抵のことはできると思っているせいか、いまいち言語の特徴が明確にできません。
上記の言語を比較してそれぞれどのようなことが言語の特徴となるのでしょうか?
よろしくお願いいたします。

Aベストアンサー

C言語……元々UNIXを開発する為に作られた。OS開発言語。俗に「高級アセンブリ」等と呼ばれる。開発当時のレベルでは「プラットフォーム間の差異を吸収する」移植性の高い言語だった。
これは元々UNIX自体が特定の「動作可能/保証するプラットフォームを持たなかった」為である。「移植性の高いOS」を作るための「移植性の高い言語」が開発目的の一つだった。
Algol等の「構造型プログラミング」の考え方を基盤としている。そして元々日常ユースは想定されていないし、「大きくて複雑なプログラム」を書く為のモノでもなかった。
UNIXの開発思想は「一つの目的の為の小さなプログラム」の集合体だった筈だが別のプラットフォームで大きくて複雑なプログラムを書く事に使われ初め当初の使用目的と大きく乖離していった。一つの背景に、貧弱なマシンでスピードを稼ぐには「C言語しか選択肢が無い」と言う状況が続いた為と思われる。
なお、C言語のコンパイラの最適化は他の言語を上回るケースが多く、現在ではOSの他に、Lisp、Perl、Python、Ruby等の「言語を書く為の言語」として使われるケースが多い。元々、プログラミング言語はアセンブリ言語で組み立てられるケースが多かったが、現時点その分野も前述の特徴の為、C言語に置き換わってる。

C++…基本的にはC言語にSimulaと言う言語の特徴を付け加えたモノ。最初はObjective CとかC with Classes等と呼ばれた。ただし、ここで言う「オブジェクト指向」は元々オブジェクト指向、と名乗ったSmalltalkの概念とは(被る分もあるものの)大幅に異なる。

Squeak(Smalltalk):
http://squeakland.jp/

また、厳密には「オブジェクト指向」を表す定義も存在しない。ただし、C++がポピュラーになるにつれて「C++型の」オブジェクト指向が受け入れられた。
C++は必ずしも「より良いC」は意味しない。元々のデザイナーであるStroustrupによる冗談も存在する。

http://hp.vector.co.jp/authors/VA000092/jokes/strup.html

VB……本家BASICとはかなりかけ離れたMicrosoftのプロプリエタリ言語。ただし、「Windowsで動くソフトを作る」分には最強の能力を発揮する、と思われる。また、BASICとしては最高、との評もある。
「VBのオブジェクト指向は本格的ではない」等と言った批判もあるが、前述のように元々「オブジェクト指向」自体の定義が曖昧な為、割に見当違いの批判だと思われる。
ただし、C言語やC++みたいに移植性は念頭に置いてない。また、本家BASICともコードの互換性はほぼ無い。

Java……一言で言うと改良版C++。開発者のジェームス・ゴスリングもそう述べている。提供元はSun Microsystems。
あまりに低レベル(アセンブリに近い)なC言語特有の操作(具体的にはポインタ)を止め、メモリ管理をガベージ・コレクション(ゴミ集め)に任せてる。これでプログラマがメモリ管理に頭を悩ます事が無くなった。
また、登場した70年代と違い、C言語の「移植性の利点」が薄れてきた事もあり、もう一段階上のレベルでの移植性を達成するように作られている。かいつまんで言うと、OS上の「Java仮想マシン」で動く言語、と言う構図になっている。言い換えると「コンピュータ上で動くコンピュータ」で動くアプリケーションが作れる、と言うのが特徴。プラットフォームの差はその「仮想マシン」で吸収される。
従って、CやC++等と違い、Javaのソースはネイティブコードにはコンパイルされないで仮想マシン上で動く中間コードへとコンパイルされる。
移植性はピカイチだが、反面、Java製のアプリは「コンピュータ上で動くコンピュータ」上で動く為、スピードの面で言うとCやC++で作成されたアプリに劣る、と言う欠点も持ち合わせている(ただし、色々なエミュレータなんかを見ても分かるように、近年はハードウェアの進歩により、そこまでスピードは問題では無くなって来た)。

C言語……元々UNIXを開発する為に作られた。OS開発言語。俗に「高級アセンブリ」等と呼ばれる。開発当時のレベルでは「プラットフォーム間の差異を吸収する」移植性の高い言語だった。
これは元々UNIX自体が特定の「動作可能/保証するプラットフォームを持たなかった」為である。「移植性の高いOS」を作るための「移植性の高い言語」が開発目的の一つだった。
Algol等の「構造型プログラミング」の考え方を基盤としている。そして元々日常ユースは想定されていないし、「大きくて複雑なプログラム」を書く為のモノ...続きを読む


人気Q&Aランキング

おすすめ情報