mov cx、4
    xor bx,bx
countb:mov di,mask
    and di,ax
    add bx,[nbit+bi]
    shr ax,4
    loop countb
    
mask: db 0x00,0x01,0x01,0x02,0x01,0x02,0x02,0x03・・・0x04

というプログラムがありました。これは1ワード内にonとなっているビット数を求める問題らしいのですが、テーブルという物を使っているようです。
このテーブルという物がよくわかりません。さらにこのプログラムではmov di maskで何をやっているのだか。さらにその後のandやaddも何をしているのかよくわかりません。さらに、この問題とは関係がないのですが、アドレスベクターテーブルという物もよくわかりません。これはswitch文の説明の後にあったのですけど。
どうか御教授ください。

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

A 回答 (2件)

答えは、n=0なら0bit、n=1=1bit、


2=1bit, 3=2bit, 4=1bit, 5=2bit, 6=2bit, 7=3bitですから、
maskと名付けられたテーブルに答えを用意しておいて、
それを参照するというプログラムです。
それだけだと、テーブルサイズが65536バイトになるため、
4分割してテーブルサイズを16バイトにしたのかな。
プログラムは微妙に間違っているし、
テーブルを省略してあったりするので確信はないです。
    • good
    • 0
この回答へのお礼

ありがとうございました。この先生は間違いの多い先生なので、また例によって、間違った物と思われます。この前アセンブラのテストがあって、テーブルを使う問題が出ましたが、なんとか乗り切りました。

お礼日時:2001/07/01 21:44

プログラムに間違いがあるような気がします。


目を皿のようにして、
確認してから質問していただけませんか。
課題か何かですか?
    • 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的機能)が含まれているかという質問です。

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

QGASの.align 4,0x90の0x90の意味

Cソースをアセンブリしたとき、.align 4,0x90とでるのですが、.align 4,0x90の0x90はどういう意味ですか。align 4+NOPという意味ですか。それとも4Bを0x90で埋めろと意味ですか。どちらでしょう。

Aベストアンサー

困ったときはまずマニュアルを読む.

参考URL:https://sourceware.org/binutils/docs-2.24/as/Align.html#Align

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

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

Aベストアンサー

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

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

QUnityのエラー「Rigidbody.AddForce(0,0,speed);」

UnityでJavaを書いています。
実行すると

Rigidbody.AddForce(0,0,speed);

上記の箇所にエラーがあると言われたのですが、
どこが問題なのかわかりません。

お分かりの方がいたら、ご教授ください。
その前後のコードも記載します。


//上矢印キーが押された場合
if(Input.GetKeyDown(KeyCode.UpArrow)){
//玉のZ軸に対して正の力を加える
Rigidbody.AddForce(0,0,speed);
}

//下矢印キーが押された場合
if(Input.GetKeyDown(KeyCode.DownArrow)){
//玉のZ軸に対して負の力を加える
Rigidbody.AddForce(0,0,-speed);
}

Aベストアンサー

Javaは凄くうっすらやった事がある程度なのですが、
こちらのサイトを参考にすると「Rigidbody.AddForce(」の後は
数字ではなく英語にて指示を記述しているので、そこを変えてみたら直るかも…?

http://openbook4.me/projects/161/sections/1045

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

Qax^2+bx+c=0の求解プロセスをDFDで表したいのですが・・・

ax^2+bx+c=0の求解プロセスをDFDで表したいのですが、aが0か、判別式が正か負か0かなどによって、その後の処理が変わってきますよね?
DFDの場合、そのような分岐はどう書けばよいのでしょうか?

Aベストアンサー

もしかしたらすでに解決されているかもしれませんが…

DFDは、本来、そういうレベルの処理をするものではありません。
フローチャートが処理の流れの記述に偏った反省から、
DFDは、処理ではなくデータの流れる方向を記述するものとなっています。
このぐらいの問題規模なら、むしろフローチャートの方が合ってるでしょう。

まあただ「本来向いていない」と言っても、
そちらには書く必要があるのだと想像します。

一応、分岐を表す記号はあります。
+を○で囲んだ記号を、二つの出力の間に書けば、
「二つの出力のどれかになる」ことを表します。
本では「分離」と言っています。
(ただし、デマルコは「基本的に使わないようにした方がよい」と書いています)

また、「プロセス」から複数の矢印を出すだけでもかまわないと思います。
矢印の側に「判別式が正の場合」「負の場合」など注釈を書いておけばいいでしょう。

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-(MOV H0FFF K3Y40)-というシーケンサの信号があります

-(MOV H0FFF K3Y40)-というシーケンサの信号があります。
シーケンサは三菱のQシリーズを使っています。
Y40~Y4Bまで全てONになると思うのですが、Y40~Y4FまでONにしたい場合、どうすればいいのでしょうか?

Aベストアンサー

MOV HFFFF K4Y40
で、どうです。

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

QCOBOL PICTUREで X,S,Vの意味

COBOL PICTUREで X(03) S9(01) とか V9(02)とか記載されているのマトリックス表があるのですが、この意味を教えてください。

Aベストアンサー

例ですが
「X(02)」または「XX」は、英数字の2バイトを表す
「9(02)」または「99」は、数字の2バイトを表す
「S9(02)」または「S99」は、符号付き数字の2バイトを表す
「9(02)V9(03)」または「99V999」は、小数点付き数字の整数部2バイト小数部3バイトを表す


人気Q&Aランキング

おすすめ情報