• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アセンブリ言語について。)

アセンブリ言語とは?

A1200hd40の回答

  • ベストアンサー
  • A1200hd40
  • ベストアンサー率52% (337/648)
回答No.7

>機械語データは、なぜ、0と 1だけではないのでしょうか? 実際は2進データであっても、「ヒト」にとっては「見づらい」ので16進数や8進数に変換して、圧縮表記します。 人間の目は機械のようにいきませんから、紛らわしい表記だと、普通に間違いが出ます。 64bitの2進データは、64文字使います。 64個の0/1を、きちんと順番を間違えずに記述するのは困難です。 (当たり前ですが、間違うと期待通りに動きません) 16bitなら4桁、32bitなら8桁、64bitなら16桁の16進で事足ります。 (ちなみに8bitで1Byteです) その昔は、雑誌に機械語ダンプリストが載ることも在ったのですよ。 マシン語モニタって、恐ろしく単純なプログラム使って打ち込んでくやつ。 こういう時にバイナリ(2進)表記だと、ページ数が相当ムダになりますよね。 それから0/1のビット列表記を入力することを考えてみてください。 そのうち目がチカチカしてきて、桁数数えるのにも疲れてしまい、頭もおかしくなってきます。 16進数は、0~9までの数字と、a~fまでのアルファベットで表現されます。 16進数の0fは10進数では15です。 16進の10は、10進では16です。 16進数等の表記に直すのは、「ヒト」のため、少しでも小さく表記して、なおかつ、間違わないようにするためです。

zasx1098
質問者

補足

16bitなら4桁、32bitなら8桁、64bitなら16桁の16進で事足ります。 (ちなみに8bitで1Byteです) なぜ、こうなるのでしょうか?教えていただけないでしょうか?すみません。

関連するQ&A

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

    これが何をしているのか教えていただけないでしょうか?すみません。 これの事です。 (機械語データ) (アセンブリ言語) 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

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

    (機械語データ) (アセンブリ言語) 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 こちらのアセンブリ言語の命令がわかるおすすめの書籍を知らないでしょうか? 教えていただけないでしょうか?すみません。

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

    (機械語データ) (アセンブリ言語) 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 で、右側のアセンブリ言語のニーモニックとオペランドについて解説していただけないでしょうか?すみません。

  • 機械語に直すことについて。

    (機械語データ) (アセンブリ言語) 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 これのintと movとxor の機械語が分かりません。後、retの機械語が、farなのかnearなのかも分かりません。教えていただけないでしょうか?すみません。

  • アセンブリ言語の質問です

    「 100人分の試験点数がある。 一人分のデータは32bit 符号無し整数でそれが連続して格納されている.先頭のアドレスがEAXで与えられる時,全員の点数の合計をEAXに入れて戻るようなサブルーチンをアセンブリ言語で書きなさい。 • loop unrollingを使用して,ループ内容を4倍に展開して,条件分岐数を減らすこと • 他のレジスタの値は保存すること • 合計点はEAXレジスタに十分納まるものとする。 • 次のような命令を使ってよい。 ADD EAX, [EBX] 」 というような問題が出て自分で解答を作ってみたのですがこれでよいのでしょうか?詳しい方ご検討よろしくお願いいたします。 PUSH EBX(EBXをスタックにおいておく) PUSH ECX(ECXをスタックにおいておく) MOV ECX 25(ECXに25を代入。4回の操作を25回すれば100回になるからである。) label0:ADD EAX [EAX] ([EAX]をEAXに加算) ADD EAX [EAX+1]([EAX+1]をEAXに加算) ADD EAX [EAX+2]([EAX+2]をEAXに加算) ADD EAX [EAX+3]([EAX+3]をEAXに加算) MOV [EAX] [EAX+4]([EAX]を[EAX+4]に移動させる) EBX=EBX+1 (EBXはこのループを何回やったか、という数) CMP ECX EBX(25とEBXを比べる) JNZ:label0(比べてEBXが25になってないならば繰り返す。25になったら終了。) POP EBX(EBXをスタックから戻す) POP ECX(EBXをスタックから戻す)

  • アセンブリ言語の宿題がわかりません。

    爆弾を解除するプログラムです。exeファイルしか与えられていません。 phase1から5まであり、それぞれにインプットを求められ、正しいインプット(解除コード)を入力すると解除できます。 間違ったコードを入力すると爆発してしまいます。1,2は解けましたが、3で躓きました。objdumpしてみて、あるstring(恐らくglobal定数)と同じインプットをすれば解除できると踏んだのですが、どうしてもその特定のstringがわかりません。 以下にobjdumpした内の一部を載せておきました。都合上最小限のコードだけ載せざるを得ませんでしたので、 下記URLに、exeファイル、逆アセンブルファイル、phase1,2のanswerをアップロードしております。お時間があれば是非ご協力をお願いします。 環境 OS:ubuntu 9.04 デバッガ:Gnu DeBugger 08048424 <_IO_getc@plt>: 8048424: ff 25 10 a0 04 08 jmp *0x804a010 804842a: 68 20 00 00 00 push $0x20 804842f: e9 a0 ff ff ff jmp 80483d4 <_init+0x18> 08048723 <phase_3_of_5>: 8048723: 55 push %ebp 8048724: 89 e5 mov %esp,%ebp 8048726: 57 push %edi 8048727: 56 push %esi 8048728: 53 push %ebx 8048729: 83 ec 1c sub $0x1c,%esp 804872c: a1 30 a0 04 08 mov 0x804a030,%eax 8048731: 89 04 24 mov %eax,(%esp) 8048734: e8 eb fc ff ff call 8048424 <_IO_getc@plt> 8048739: bb 00 00 00 00 mov $0x0,%ebx 804873e: 8d 75 e6 lea -0x1a(%ebp),%esi 8048741: eb 04 jmp 8048747 <phase_3_of_5+0x24> 8048743: 88 44 33 ff mov %al,-0x1(%ebx,%esi,1) 8048747: a1 30 a0 04 08 mov 0x804a030,%eax 804874c: 89 04 24 mov %eax,(%esp) 804874f: e8 d0 fc ff ff call 8048424 <_IO_getc@plt> 8048754: 83 f8 0a cmp $0xa,%eax 8048757: 74 06 je 804875f <phase_3_of_5+0x3c> 8048759: 43 inc %ebx 804875a: 83 fb 0f cmp $0xf,%ebx 804875d: 75 e4 jne 8048743 <phase_3_of_5+0x20> 804875f: c6 45 f3 00 movb $0x0,-0xd(%ebp) 8048763: 8d 75 e6 lea -0x1a(%ebp),%esi 8048766: bf e4 8b 04 08 mov $0x8048be4,%edi 804876b: b9 0d 00 00 00 mov $0xd,%ecx 8048770: fc cld 8048771: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi) 8048773: 0f 97 c2 seta %dl 8048776: 0f 92 c0 setb %al 8048779: 38 c2 cmp %al,%dl 804877b: 74 0c je 8048789 <phase_3_of_5+0x66> 804877d: c7 04 24 03 00 00 00 movl $0x3,(%esp) 8048784: e8 31 fe ff ff call 80485ba <explode> 8048789: 83 c4 1c add $0x1c,%esp 804878c: 5b pop %ebx 804878d: 5e pop %esi 804878e: 5f pop %edi 804878f: 5d pop %ebp 8048790: c3 ret

  • アセンブリ言語の初歩的な質問です

    xを入れたらx!を返すような階乗のプログラムをアセンブリ言語で作りたいので、頑張っているのですが ADD EAX EBXとすればEAX=EBX+EAXという足し算になりますよね。 そこで掛け算を行うようなものを入力したいのですが EAX*EBXは(掛け算は) MUL EAX EBX とすればいいのでしょうか?

  • アセンブリのプログラムです。

    アセンブリのプログラムで質問があります。cのプログラムのオブジェクトファイルを生成して、objdumpというコマンドでアセンブリ言語を表示させてみたのですが、全然分からなくて、困っています 。どうか、アセンブリプログラムの、解説をよろしくお願いします。できれば、1文1文解説してもらえるとありがたいです。あと、スタックの動き、確保などの解説もあるとありがたいです。よろしくお願いします。 cのプログラム int fact(int p) { if(p<=1) return 1; else return fact(p-1); } アセンブリのプログラム push %ebp mov %esp,%ebp sub $0x8,%esp cmpl $0x1,0x8(%ebp) jg 15 <_fact+0x15> movl $0x1,-0x4(%ebp) jmp 24 <_fact+0x24> mov 0x8(%ebp),%eax dec %eax mov %eax,(%esp) call 0 <_fact> mov %eax,-0x4(%ebp) mov -0x4(%ebp),%eax leave ret nop nop nop

  • C言語->アセンブリ->C言語で構造体渡し

    OS開発をしています。 たとえば、 typedef struct test{ int t1; int t2; int t3; int t4 int t5; }test; という構造体があったとして、 ----アプリケーション---- void main(){ test data; data.t1=100; data.t5=200; testint(data); } ----ライブラリ(アセンブリ)---- _testint: PUSH EBX MOV EBX,ESP INT 0x52 POP EBX RET ----OS側---- int API(int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax){ test data; data= *(((int *)ebx) + ?); … // ↑ } というプログラムのとき、 ?には、どのような数字を入れれば、 OS側のdataにアプリ側のdataが代入できるでしょうか。 test構造体のサイズは、 20Byteです。 長い質問ですが、回答お願いします。

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

    2進数の羅列では人間にはあまりに読み書きしにくいからです。 それを命令単位に区切って、英単語を元にした名前を与えたのが、アセンブリ言語です。 ニーモニックとは、その命令の名前の事です。とはどういう事でしょうか?教えていただけないでしょうか?すみません。 push %ebp mov %esp,%ebp and $0xfffffff0,%esp sub $0x10,%esp mov 0xc(%ebp),%esp : というプログラムで、オペランドが、%ebpなどがそうなのでしょうか?で、このプログラム言語自体をアセンブリ言語というのでしょうか?また、なぜ、低水準言語というのが存在しているのでしょうか?教えていただけないでしょうか?すみません。