LD GR3,GR1 ;GR3にGR1の数字を入れる。
AND GR3,=#000F ;数字を数値に変換

というアセンブラのプログラムがあったのですが、なぜGR3と16進数#000Fの論理積をとることで数字を数値に変換できるのでしょうか。

それと、ここでいう数字、数値の違いとは、数字の1はコンピュータ上では
49という数値に変換される(アスキー文字)という認識でよろしいでしょうか。

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

A 回答 (1件)

2進数で表したときの下4桁だけが残ることになるからです。



アスキーコードでは、数字の「1」は、10進で49、16進で31です。
16進の31を2進数に直すと、0011 0001です。
これと16進のOF、つまり2進の0000 1111と論理積をとると、0000 0001となり、数値の1になります。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございました。

お礼日時:2009/05/27 21:05

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qtoday画面の編集。ソフトはCPUに依存するの

todayをカスタマイズしたいんですが、

ソフトをみてると対応CPU : ARMV4, ARMV4I とか表示があったりします。

ウィルコムのw-zero esを使っています CPUはIntel® PXA270 となっていますがどの表示のやつが対応してるのでしょうか?

OSは、Microsoft® Windows Mobile® 5.0 software for Pocket PC 日本語版が入っています。パソコンではCPUがどれか気にすることなくソフトをインストールしてきたのでよく分かりません。おおしえください

Aベストアンサー

[es]はARM互換です。というより、WindowsMobile5.0はARM互換用しかありません。Intel PXA270というのがARM互換なのです。

>パソコンではCPUがどれか気にすることなく
そりゃ、パソコン(というよりWindowsマシン)はx86互換CPUだけですから。

Qfmlのconfig.phで使う、q{~};やq#~#;q%~%;は全て同じ意味?

メーリングリストのカスタマイズをしていて、ネット上で情報を集めているのですがどうしても分からないところがあります。 fml 4.0
$SMTP_OPEN_HOOKなどのHOOKを行うときに、q{~};やq#~#;q%~%を同じサイトであっても使い分けているようで、SMTP_OPEN_HOOKの時には =q{~}; を、START_HOOKでは =q#~#; のようになっています。
プログラムというもの自体触ったことはないのですが、一応記号が変わっているだけで中身は同じなのかなと思っています。
実際のところ別物でしょうか?

fmlとqで検索をかけても情報が引っかかりませんし、fmlとq#などとしてもfmlでしか検索できないみたいで八方ふさがりです。
よろしくお願いします。

Aベストアンサー

fmlはPerlという言語で書かれています。これはPerlの記法の問題です。
どれも意味は同じです。違うのは、
・囲まれた内部で使われて無い記号を使って囲むため
・書いた人が違う
・気分によって使い分け?

QCPU依存によりバイナリが違う

SunOS4.0からLinuxにバイナリを移したところ2バイト以上のデータだと前後バイトのデータが逆になるという問題が起こりました。人にはCPUがIntelだからだと聞きました。CPUが違うバイナリを整形するフィルタなどはないでしょうか?データの解析ができずに困っております。

Aベストアンサー

Big Endian (Sun) と Little Endian (Intel) の問題ですね。

toysmith さんのいうように、ファイルのフォーマットに依存する
と思います。非常に単純に short のデータが並んでいるだけとか、
long が並んでいるだけなら、

#!/usr/local/bin/perl
while (read(STDIN, $long, 4) == 4) {
print join('',reverse(split('',$long)));
}

という簡単なスクリプトで変換できます。double とか float も同
じです。

しかし、いろんなサイズのバイナリデータが混在してたり、文字が
入ってたりすると、自分で変換プログラムを作る必要があります。
そうはいっても、読むプログラムがあるわけですから、何らかの規
則で並んでいるはずで、上のスクリプトを適当にいじれば作れるで
しょう。

あと考えつくのは、データは変換せずに、Linux 側のプログラムを
改造して、SunOS の方式で書かれたデータをそのまま読めるように
してしまうことです。

例えば、

long endianswaplong(long l)
{
int i;
long tmp;
for (i=0; i<sizeof(long); i++) {
((char*)&tmp)[i] = ((char*)&l)[sizeof(long)-i-1];
}
return tmp;
}

というような関数(群)を作って、読むたびに変換してから利用す
ればいいのです。(動かしてないので、バグがあるかも)

Big Endian (Sun) と Little Endian (Intel) の問題ですね。

toysmith さんのいうように、ファイルのフォーマットに依存する
と思います。非常に単純に short のデータが並んでいるだけとか、
long が並んでいるだけなら、

#!/usr/local/bin/perl
while (read(STDIN, $long, 4) == 4) {
print join('',reverse(split('',$long)));
}

という簡単なスクリプトで変換できます。double とか float も同
じです。

しかし、いろんなサイズのバイナリデータが混在してたり、文字が
入ってたり...続きを読む

QC#で文字列を数値に変換する方法

Visual Stdio .NET 2003を使っています。
C#で文字列(数字)を数値に変換したいのですが、
VBでいうVal関数のような物はありますか?例えば、

double a;
a = Val("3.14");

とすると、aに3.14が入るような関数を使いたいです。
検索したのですが、見つかりませんでした。宜しくお願いします。

Aベストアンサー

#2 の者です。。。

今回の場合は、System.Double.Parse() でしたね。。。
double.Parse() でも可能です。(上記と同じものです)

QCDリッピングの速度のCPU依存について

音楽がとても好きで、かなりの数のCDを所持していますが、ハードディスクの容量もだんだん大きくなってきているので、全てをリッピングして、パソコンをジュークボックスのようにしたいと思っています。

そこでそれ専用の、新しいパソコンを作りたいと思っています。

socketAM2が最近出たこともあり、そのCPUで作りたいと思うのですが、CPUの能力によってどの位速度が違ってくるのかというのがよくわかりません。

特にsempronとデュアルコアathlonとで音楽CDのリッピングにどの位の差が出るのかが知りたいです。
socket939などのデータでも構いません。

ちなみにリッパーはWMPまたは、RECORDNOW〔roxio)を使用し、フォーマットはWMAが多いです。
 
CDドライブはできるだけ早いものを買うつもりですが、もしこちらでも読み取り性能のよいものをご存知でしたらお願いします。

以上よろしくお願いいたします

Aベストアンサー

結論から言うと、あまり気にしないでも大丈夫です。

CDリッピングは、CDドライブからのデータの読込時間がボトルネックとなりますので、CPUでの速度差は無いと考えていいでしょう。

ドライブに書かれている速度ですが、必ずしもドライブの速度ではありません。
たとえば「52倍速」だと、データCDの場合に、最高時に52倍速で読込が行われるわけで、すべての状態で52倍速で読込が行われる訳ではありません。
今時は店頭で普通に売られているものでしたら大丈夫ではないでしょうか。

ちなみに、DVDのエンコードをすると、CPUの性能がモロに影響しますので、DVDのエンコードを考えておられるなら、できるだけ高速なCPUがいいでしょう。

QVB6, VB2005,VC# どれを学習したらよいでしょうか。

VB6, VB2005,VC# どれを学習したらよいでしょうか。
やりたいことはデータベースやテキストファイル処理、インターネットコネクションのプログラミングです。

仕事でExcelVBAを時々使うので、以前から持っているVB6かと思ったのですが、なぜかMSDNがなくリファレンスがなく微妙です。本かウェブしか頼れない・・・。
ある程度の処理速度を求めていますのでExcelVBAではない方がいいのですが、これからのことを考えたらVB6よりもVB2005でしょうか?
それともどうせVB2005はexcelとは大幅に文法が変わってしまうのだからC#?
いろいろ調べるほどわからなくなってしまいました。
なおエクセルVBAも本に一通り書いてあることも満足にできない程度です・・・。(こちらにも役立てられるとさらにうれしいです)

Aベストアンサー

process9です。
>仕事上でVBAのマクロを書く機会がたまに(1週あたり50行ぐらい?)あるので、仕事面との相乗効果という観点からVB6との比較ではC#はどうでしょうか。

やりたいことが仕事に関係があるかどうかだと思います。
関係がある場合、仕事上での使用でVBAを使うとのことでしたので、VB6を私は押します。学習スピード、使用マシンのスペック、周りの方の環境などで当面作れればよいと思われますし、使える人が多数いるのでこういうQAでもレスポンスなどが早いし、正確。リファレンス自体はWEBで十分だと思われます。周りと自身の仕事環境が変化(バージョンUPなど)したときにVC#などに乗り換えた方が効率がよいかと思います。

仕事に関係ない(趣味で作成する)ということであれば、将来性、言語としての完成度からVC#をお勧めします。ただ、.NET系はまだ発展途上なので、動作の安定性、配布性に問題があります。でも、クライアントプログラムの世界では、将来的に(3~5年後くらい?)には標準の開発言語になりうると思われます。

QZ80CPUを用いてステッピングモータを動かすアセンブラプログラムに解説をお願いします(長いです)

スイッチ12でスタート、スイッチ11でストップするようにステッピングモータを回転させるプログラムです。

1つ1つの命令は命令表を見れば何とか分るのですが、プログラムのしくみというか、何をしているかがよく分りません。
(うまく言えなくてごめんなさい)
読みにくくて申し訳ないのですが、自分で理解するには難しいのでわかる方にできるだけ丁寧な解説をつけてほしいです。

よろしくお願いします。

 (初期設定)
BEGIN:
  DI        
  LD   SP,STACK   
MAIN:        
  LD   A,0FH
  OUT  (PIOAC),A
  LD   A,0CFH
  OUT  (PIOBC),A
  LD   A,0F0H
  OUT  (PIOBC),A
  XOR  A
  LD  (SCALE1),A
  LD  (STEP_C),A
  LD  (STBCNT),A
  LD  (TOTAL_P),A
  LD  (STROBE),A
  OUT  (PIOBD),A
  LD   A,83H
  OUT  (CMDPT),A
  CALL  CTCSET
  EI

READIN:
  LD  HL,INBUF
  LD  A,2
  LD  B,0
  LD  C,A
  ADD  HL,BC
MAINLP:
  LD  A,(HL)
  BIT  5,A
  JP  NZ,STOP
  LD  A,01H
  LD  (TOTAL_P),A
STOP:
  LD  A,(HL)
  BIT  4,A
  JP  NZ,MAINLP
  XOR  A
  LD  (TOTAL_P),A
  JP  MAINLP
VINT0:
  EI
  RET
VINTI:
  JP  INT1
VINT2:
  EI
  RETI
VINT3:
  EI
  RETI
ENABLE:
  EI
  RETI
INT1:
  PUSH HL
  PUSH DE
  PUSH BC
  PUSH AF
  CALL ENABLE
  LD  A,(SCALE1)
  INC  A
  LD  (SCALE1),A
  CP  COUNT
  JP  NZ,INT50
  XOR  A
  LD  (SCALE1),A
INT16M:
  CALL STEP_M
INT50:
  CALL IN_SW
  LD  A,(STBCNT)
  INC  A
  LD  (STBCNT),A
  CP  6
  JP  NZ,SKIP
  XOR  A
SKIP:
  LD  (STBCNT),A
  OUT  (PIOBD),A
RTINT1:
  POP  AF
  POP  BC
  POP  DE
  POP  HL
  RET
IN_SW:
  PUSH HL
  PUSH DE
  PUSH BC
  PUSH AF
  LD  HL,INBUF
  LD  A,(STBCNT)
  LD  C,A
  LD  B,0
  ADD  HL,BC
  IN  A,(PIOBD)
  LD  (HL),A
  POP  AF
  POP  BC
  POP  DE
  POP  HL
  RET
CTCSET:
  IM  2
  LD  HL,VECT0
  LD  A,H
  LD  I,A
  LD  A,L
  OUT  (CTCADR),A
  LD  HL,CTCTBL
  LD  B,4
  LD  C,CTCADR
CTCST1:
  LD  A,(HL)
  INC  HL
  OUT  (C),A
  LD  A,(HL)
  INC  HL
  OUT  (C),A
  INC  C
  DJNZ CTCST1
  RET
STEP_M:
  PUSH HL
  PUSH DE
  PUSH BC
  PUSH AF
  LD  A,(TOTAL_P)
  BIT  0,A
  JP  Z,JPPOP
  LD  A,(STEP_C)
  INC  A
  AND  MASK
  LD  (STEP_C),A
  LD  E,A
  LD  D,0
  LD  HL,PHASE
  ADD  HL,DE
  LD  A,(HL)
  OUT  (PORTC),A
JPPOP:
  POP  AF
  POP  BC
  POP  DE
  POP  HL
  RET
  ORG  8100H
  (以下データ)
  END

何か質問等があれば補足します。

スイッチ12でスタート、スイッチ11でストップするようにステッピングモータを回転させるプログラムです。

1つ1つの命令は命令表を見れば何とか分るのですが、プログラムのしくみというか、何をしているかがよく分りません。
(うまく言えなくてごめんなさい)
読みにくくて申し訳ないのですが、自分で理解するには難しいのでわかる方にできるだけ丁寧な解説をつけてほしいです。

よろしくお願いします。

 (初期設定)
BEGIN:
  DI        
  LD   SP,STACK   
MAIN:    ...続きを読む

Aベストアンサー

とりあえず解析は終わりました。ソースにコメントの形で書いてあります。
回路図があったんで何とか解析できた感じです。ステッピングモーターの情報は無くても今回は何とかなりましたんで。
#4の質問は答えてくださいね。それによってアドバイスが変わりますので。

BEGIN:
  DI        
  LD   SP,STACK   
MAIN:        
;初期化
;Z80PIO(PA)をバイト出力モードに設定。
  LD   A,0FH
  OUT  (PIOAC),A
;Z80PIO(PB)をビット制御モードに設定。
  LD   A,0CFH
  OUT  (PIOBC),A
;Z80PIO(PB)をbit0-3:出力 bit4-7:入力
  LD   A,0F0H
  OUT  (PIOBC),A
;ZEROクリア
  XOR  A
  LD  (SCALE1),A
  LD  (STEP_C),A
  LD  (STBCNT),A
  LD  (TOTAL_P),A
  LD  (STROBE),A
  OUT  (PIOBD),A
;8255の設定。Aポート出力。Bポート入力。Cポートbit0-3:入力 bit4-7:出力
  LD   A,83H
  OUT  (CMDPT),A
;CTCの初期化処理
  CALL  CTCSET
  EI

;SW11,12を調べてモータのON/OFFを制御を無限ループで繰り返している。
READIN:
  LD  HL,INBUF
;LD BC,2の方が好きだけど。問題はありません。
  LD  A,2
  LD  B,0
  LD  C,A
  ADD  HL,BC
MAINLP:
  LD  A,(HL)
  BIT  5,A
  JP  NZ,STOP
  LD  A,01H
  LD  (TOTAL_P),A
STOP:
  LD  A,(HL)
  BIT  4,A
  JP  NZ,MAINLP
  XOR  A
  LD  (TOTAL_P),A
  JP  MAINLP



VINT0:
  EI
  RET

VINTI:
VINTI:
  JP  INT1

VINT2:
  EI
  RETI

VINT3:
  EI
  RETI

ENABLE:
  EI
  RETI


;2m秒ごとに割り込んでくる。
INT1:
  PUSH HL
  PUSH DE
  PUSH BC
  PUSH AF
  CALL ENABLE
;SCALE1カウンタを+1
  LD  A,(SCALE1)
  INC  A
  LD  (SCALE1),A
;COUNTに達したら0を入れて、CALL STEP_Mステッピングモータ処理へ
  CP  COUNT
  JP  NZ,INT50;ステッピングモータ処理をスキップ
  XOR  A
  LD  (SCALE1),A
INT16M:
  CALL STEP_M;16msに1回呼び出されるみたい。
INT50:
;IN_SWスイッチ処理を呼び出し。
  CALL IN_SW
;STBCNTカウンタを+1
  LD  A,(STBCNT)
  INC  A
  LD  (STBCNT),A
;6になったらクリアする。
  CP  6
  JP  NZ,SKIP
  XOR  A
SKIP:
  LD  (STBCNT),A
;LEDのダイナミックドライブ 兼 SWのダイナミックスキャン。Z80PIO(PB)に出力
  OUT  (PIOBD),A
RTINT1:
;割り込みを抜けてもとの処理に戻る。
  POP  AF
  POP  BC
  POP  DE
  POP  HL
  RET

;スイッチサブルーチン
IN_SW:
  PUSH HL
  PUSH DE
  PUSH BC
  PUSH AF
;今ダイナミックスキャンされているSWの情報を取り込む
  LD  HL,INBUF
  LD  A,(STBCNT);swの横の番号
  LD  C,A
  LD  B,0
  ADD  HL,BC
;Z80PIO(PB)から取り込み
  IN  A,(PIOBD)
  LD  (HL),A
  POP  AF
  POP  BC
  POP  DE
  POP  HL
  RET

;Z80CTCの初期化。2m秒ごとの割り込みを発生させているらしい。
CTCSET:
  IM  2;割り込みモード2
;割り込みベクタの設定
  LD  HL,VECT0
  LD  A,H
  LD  I,A
  LD  A,L
  OUT  (CTCADR),A
;割り込みタイマの設定。手元にZ80CTCの資料がないので自力で確認のこと。
  LD  HL,CTCTBL
  LD  B,4
  LD  C,CTCADR
CTCST1:
  LD  A,(HL)
  INC  HL
  OUT  (C),A
  LD  A,(HL)
  INC  HL
  OUT  (C),A
  INC  C
  DJNZ CTCST1
  RET

;ステッピングモータの制御
STEP_M:
  PUSH HL
  PUSH DE
  PUSH BC
  PUSH AF
;モーターON?
  LD  A,(TOTAL_P)
  BIT  0,A
  JP  Z,JPPOP;OFFなら抜ける、
;ステッピングモータのカウント。0~3を繰り返す。
  LD  A,(STEP_C)
  INC  A
  AND  MASK
  LD  (STEP_C),A
;カウントとステッピングモータのフェーズテーブルを参照する。
  LD  E,A
  LD  D,0
  LD  HL,PHASE
  ADD  HL,DE
  LD  A,(HL)
;ステッピングモータにフェーズデータを送る。
  OUT  (PORTC),A

JPPOP:
  POP  AF
  POP  BC
  POP  DE
  POP  HL
  RET
  ORG  8100H
  (以下データ)
  END
  
  
  
CTCADR  EQU  00H;CTCの制御レジスタ

PIOAD  EQU  08H;Z80PIO Aポートデータ(bit0-7: LED 7SEG)
PIOAC  EQU  09H;Z80PIO Aポートコントロール
PIOBD  EQU  0AH;Z80PIO Bポートデータ(bit0-3:LED drive,bit4-7: swのスキャン)
PIOBC  EQU  0BH;Z80PIO Bポートコントロール

PORTA  EQU  0CH;8255 ポートA
PORTB  EQU  0DH;8255 ポートB
PORTC  EQU  0EH;8255 ポートC ここにステッピングモーターが接続されているらしい。
CMDPT  EQU  0FH;8255 コントロール

STACK  EQU  9000H
MASK  EQU  03H
COUNT  EQU  8

ORG  8000H
(以下データ)
  ORG  8100H

VECT0:  
  DW  VINT0
  DW  VINT1
  DW  VINT2
  DW  VINT3

CTCTBL:
  DB  05H,00H
  DB  0B7H,31
  DB  05H,00H
  DB  05H,00H

PHASE:
  DB  90H
  DB  30H
  DB  60H
  DB  0C0H

STEP_C: DS  1
SCALE1: DS  1
TOTAL_P: DS  1
STBCNT: DS  1
INBUF : DS  6
STROBE: DS  1

END

とりあえず解析は終わりました。ソースにコメントの形で書いてあります。
回路図があったんで何とか解析できた感じです。ステッピングモーターの情報は無くても今回は何とかなりましたんで。
#4の質問は答えてくださいね。それによってアドバイスが変わりますので。

BEGIN:
  DI        
  LD   SP,STACK   
MAIN:        
;初期化
;Z80PIO(PA)をバイト出力モードに設定。
  LD   A,0FH
  OUT  (PIOAC),A
;Z80PIO(PB)をビット制御モードに設定。
  LD   A...続きを読む

QアセンブラソースをCOBOLソースに自動変換

アセンブラソースをCOBOLソースに自動変換するようなソフトは有るのでしょうか。

Aベストアンサー

実行ファイルからソースを作成するソフトは、ディスコンパイラ(逆コンパイラ・デコンパイラとも)と言うものです。

javaだとディスコンパイラが存在し、割合実用になるっぽいですが、COBOLでは存在自体が厳しいですね…Cだったら探せばディスコンパイラはありますけど、x86以外の処理系ではなかなか厳しいと思います。No2の回答者さんからも指摘がありますが、処理系が何かをはっきりさせないと、一般論的回答しか付かない(それしかできない)と思いますよ。

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

QアセンブラからC言語に変換するにはどうすればいいのでしょうか?

アセンブラのプログラムをどうにか解読して、C言語に置き換えようとこつこつ行っています。

ですが、プログラム量が多いので解読に時間を要してしまいます。
どうにかして変換したいのですが、手早く変換できる方法はありませんでしょうか?

また、自分で調べても分からない単語があります。(見落としているかもしれませんが)
 .EQU   .BEQU
この二つのコマンドが何を示しているのかがわからないのでこれについても教えてもらえたらうれしいです。

Aベストアンサー

どういう目的でやるのかもあるとおもいますが、単に、今動いているアセンブラプログラムを、その環境がなくなるので、Cで書き換えて、新しい環境に移したい、とかいうのであれば、そうですね。

 まず、I/O関係のサブルーチンは、全部、解読する必要があるでしょう。
 で、それへの入力パラメータと、リターン値も。変数変更とかもあれば、それも、読む。

 で、純粋に、演算部分のみのところは、Cで、レジスタ操作をシミュレートするように、すると。多少、テクニックがあれば、コードジェネレータみたいなアプローチもありえます。

 ようは、
元のコードのやっている内容
コメントおよび保守文書がどの程度あるか
全体のボリューム
作業にかかる智がいかほどか

ということになりましょうか。旧のアセンブラコードが、新の環境でも動くなら、全部を移植ではなくて、必要不可欠な部分のみ、Cにして、C+asmにするという手もあるかと。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報