• ベストアンサー

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

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

noname#178821
noname#178821

質問者が選んだベストアンサー

  • ベストアンサー
  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.3

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

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

アセンブラによっては, ニーモニックを含めてマクロとかで置き換えることができたような気がする. nasm でできるかどうかは知らん.

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

アセンブル言語の命令をニーモニックと呼びますがこれは自分で勝手に作ってもいいですよ 普通はCPUメーカのニーモニックを使いますがmovは嫌いだから俺はLDを使うと決めても問題ありません 16進数の表記も0xでもhでも好きな表記法を使ってかまいません ただそのニーモニックを正しい機械語に変換するアセンブラまで自作しないとだめです まあ1対1で対応させるだけなので出来ないことはないでしょう

回答No.4

最終的な機械語が同じであれば,作るのは可能です。 例えば,i386系の B8 01 00 00 00 という機械語は,Intelニーモニックのアセンブリ言語ならば mov eax, 1 ですが,GAS (The GNU Assembler) ならば movl $1, %eax になります。 ちなみに,「アセンブリ言語」を「アセンブル」することができるプログラムが「アセンブラ」です。 「コンパイル可能言語 (e.g. C)」を「コンパイル」することができるプログラムを「コンパイラ」と呼ぶのと同じ関係です。

  • tohru999
  • ベストアンサー率49% (76/154)
回答No.2

それは、アセンブラ言語ではなく、コンパイラですね。 CPUは、move ax,1とかInt 21等の命令は理解できません。 コンパイルされた機械語(マシン語)のみ理解できます。 ですので、ソフトウェアレベルで変える(作る)ことができるのは コンパイラとなります。

回答No.1

コンパイラをご自身で作りたいという趣旨と判断して回答します。 現存のアセンブラ(コンパイラ)にマクロ機能が大抵付いていますので、自分の書きやすいニーモニックで書いて本来のアセンブラコードを吐き出す様にマクロ定義を書けば、ご希望の環境を作成できると思います。 もしくは、Visual C++などでソースデコーダーからマシン語への変換までの全てを作れば ニーモニックの置き換えは当然可能です。自分しか使わないと決めて、ラベル数は1ファイル最大256個だとか、include機能は無いなどと、機能を限定したアセンブラは意外と短期間でも作れますよ。

noname#178821
質問者

お礼

ありがとうございます。 説明がかなり悪かったです・・ 自分自身はアセンブラはCPUに依存していて OSが違っても表記方法など、すべて同じだと思っていたのですが linuxのnasmはint 0x80なのに windowsだとint 21hなので疑問に思い質問しました。 movをmoveに変えられるか?という質問は 要は自分でアセンブラのコンパイラを作れるのか、 nasmも作られたものでnasmの表記方法自体変えられるのか?という意味です。 (アセンブラは初めからハードウェアに組み込まれている? と勘違いしていました。)

関連するQ&A

  • アセンブラできません。

    初心者です。 アセンブリ言語で1~9の数字を連続的に表示するプログラムを書いたのですが、アセンブラする時 「error A2016 expression expected」というエラーメッセージが出てアセンブラすることができません。 プログラムの内容は下記↓のものです。 何が原因でしょうか? CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov bl,30h jmp aa aa: mov ah,02h mov dl,bl int 21h mov ah,06h mov dl,0ffh int 21h jnz bb: mov ah,02h mov dl,08h int 21h inc bl cmp bl,39h ja START jmp aa bb: int 20h CODE ENDS END START

  • NASM(独習アセンブラのサンプルソース)について

    独習アセンブラ初版5刷のサンプルソース(リスト6.7、102p)での疑問です 下の方にあるコメントアウトしているputc関数って何のためにあるんですか? どこからも呼び出してないのでいらないと思うのですが… アセンブラはNASMです ※本に書かれてるソースはコメントアウトしてません、コメントアウトしてもアセンブルできました bits 16 org 100h mov dx,sfile mov al,0 mov ah,3dh int 21h jc endquit mov [ifh],ax mov dx,dfile mov cx,0 mov ah,3ch int 21h jc endquit mov [ofh],ax readb: mov bx,[ifh] mov dx,buf mov cx,1 mov ah,3fh int 21h test cx,ax jz endquit jc endquit mov bx,[ofh] mov dx,buf mov cx,1 mov ah,40h int 21h jmp readb endquit: mov bx,[ifh] mov ah,3eh int 21h mov bx,[ofh] mov ah,3eh int 21h mov ax,4c00h int 21h ;putc: ; push ax ; mov ah,2h ; int 21h ; pop ax ; ret ifh dw 0 ofh dw 0 sfile db "srcfile.txt",0 dfile db "destfile.txt",0 buf resb 2 私が思うにリスト6.6(100p)のreadbラベルのところでこれを呼び出してるのでソースを流用して消し忘れてるだけなんでしょうか?

  • 8086のアセンブラについて

    8086で浮動小数点のアセンブラのmasmを勉強しているのですが 参考書に書いてある mov temp,ax という命令の tempとはどこをさすのかわかりません メモリの適当な場所をさすのでしょうか おしえてください:;

  • アセンブラを実行したいのですが

    パソコン初心者です。 Windows XPにアセンブラ「NASM」をダウンロードしました。 コマンドプロンプトで簡単なプログラムを実行しようと思います。 以下がプログラムです。 ; dispchar.asm mov ah,02 mov dl,31h int 21h mov ah,4ch mov al,0 int 21h コマンドプロンプトに「; dispchar.asm」と入力すると、内部コマンド、外部コマンドまたは操作可能なファイル、バッチファイルとして認識されていません」と出ます。 同様に、「mov ah,02」から入力しても同様のコメントが返ってきます。 プログラムを実行するにはどうすればよいでしょうか?

  • アセンブリ言語について。

    CPUを直接操作するうなプログラムは高水準言語では作れないので低水準言語が必要になります。 CPUをスリープ状態にするHLT命令はアセンブラにはありますがC言語などの高水準言語には無い機能ですから、アセンブラを使ってプログラムを書かないと実現できません。というのは、合っていますでしょうか?教えていただけないでしょうか?すみません。

  • アセンブラ(二度目)

    先ほど質問させていただいたのですが、NASMでobjファイルを出力して、 ALINKをつかってexeファイルを出力したのですが、その際結果を確認するのに邪魔なものが一緒に出力されました。 ソースはこれです。 segment code ..start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, stacktop mov dx, hello mov ah, 0x09 int 0x21 mov ax, 0x4c00 int 0x21 segment data hello: db 'Hello World',13,10,'$' segment stack stack resb 64 stacktop:

  • アセンブラ、ファンクションコールの使い方

    入力した一文字を改行して表示させるものを作ってます。 以下のものを書いてみまして、 一文字読み取って改行はしますが表示されません。 アドバイス頂けますでしょうか? 環境は MASM 32 です。 name double .model small .stack 100 .data prompt db 0ah,0dh,"? $" .code start: mov ax, @data mov ds, ax lea dx, prompt mov ah, 9 ;output string int 21h mov ah, 1 ;get keyboard input and store into al int 21h mov dl, 0ah mov ah, 2 int 21h mov dl, 0dh mov ah, 2 int 21h mov dl, al mov ah, 2 ;output char from dl int 21h mov ax, 4c00h ;exit int 21h end start

  • 文字を表示するファンクションコールについて

    アセンブリ言語プログラムについての質問です。 MASM32を使っています。AXレジスタの数値をah→表示、al→表示というプログラムを作ったのですが、al→表示の部分がうまく機能しせません。以下にプログラムを書きます。 (1)mov ax,3132h (2)mov dl,ah (3)mov ah,02h (4)int 21h (5)mov dl,al (6)mov ah,02h (7)int 21h (分かりやすく番号をふっています。実際のプログラムには番号はふっていないです。) 具体的どこが機能しないかというと、(5)番目の命令のalレジスタの内容をdlレジスタに転送するという命令が機能しません。デバックのT命令で確認したところ(5)番目の命令がNOPとなっていました。 このプログラムを実行すると結果的に表示されるのは「11」という文字です。(本来は12と表示したい。) 質問 なぜ(5)番目の命令がnopとなるのでしょうか?

  • アセンブラでWindowsAPI

    アセンブラだけでWindowsAPIを叩いてウインドウを表示させることはできるのでしょうか。C言語で普通にできるので、相当複雑になるとは思いますが、当然アセンブラでもできると思います。C言語だと変数の型の名前なども変な名前がいろいろ付いていて裏で何をやっているのかさっぱりわかりません。普通に使う分には問題ないのですが、ブラックボックスのような感じで気持ち悪いのです。どのような命令でAPIが呼び出されているのかCPUレベルで知りたいです。C言語の呼び出し規約ということで、MS-DOSのシステムコールみたいなものとは違うと思うのですが、どうなのでしょうか。

  • アセンブリ言語について。

    >2進数の羅列では人間にはあまりに読み書きしにくいからです。 >それを命令単位に区切って、英単語を元にした名前を与えたのが、 >アセンブリ言語です。 ニーモニックとは、その命令の名前の事です。 簡潔に要点がまとまっている、すばらしい説明ですね。その通りです。 これで理解できないなら、追加の説明のしようがありません。 (なお、このように、他人の発言は引用符を付けて引用すると、わかりやすくなります。是非そうしてください。) まあ具体例を挙げるならこんな感じ。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret 人間がCPUを直接動かすプログラムを書こうとするとき、アセンブリ言語を使って書きます(右側の部分)。 mov $0x616b6157,%eax push %ebx push %eax mov $0x4,%edx mov $0x1,%ebx mov $0x4,%eax mov %esp,%ecx int $0x80 pop %eax xor %eax,%eax pop %ebx ret そしてこれをアセンブルすると、1対1対応した機械語のデータ列が出来ます。 それが b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 この部分。 機械語には改行なんてありませんから、実際は一連の b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 と言うデータ列になります。 これをCPUが実行していきます。 相当熟練した人で無ければ、このデータ列を見るだけでプログラム構造を理解する、というわけに行きません。 なので、人間が機械語レベルでプログラミングする際には、アセンブリ言語を使います。 ※この回答のプログラムはこちらから引用しました。 >31バイトでつくるアセンブラプログラミング アセンブラ短歌の世界 >https://book.mynavi.jp/support/pc/4946/c01_assembra.pdf で、機械語データは、なぜ、0と 1だけではないのでしょうか?教えていただけないでしょうか?すみません。