このアセンブラのプログラムはIN命令によって3桁のレコードに入力された10進数の値を2進数に変換するプログラムです。

INPUT START                      (1)
RPUSH                      (2)
IN IBUF,ILEN ;レコードを入力       (3)
    LD GR0,ILEN                (4)
JMI FIN2 ;ファイルの終わり      (5)
LD GR1,=0   ;けた数のカウンタ      (6)
LD GR4,=0   ;数値の初期化        (7)
LOOP2 LD GR3,IBUF,GR1               (8)
AND GR3,=#000F ;数字を数値に変換      (9)
LD GR5,GR4;ここから↓4つの命令はGR4を10倍する (10)
SLL GR5,3;                   (11)
SLL GR4,1;                   (12)
ADDA GR4,GR5;                  (13)
ADDA GR4,GR3                   (14)
ADDA GR1,=1                   (15)
CPA GR1,GR0                   (16)
JMI LOOP2                    (17)
LD GR0,GR4                   (18)
FIN2 RPOP                         (19)
RET
ILEN DS 1
IBUF DS 256
END

(8)のLOOP2 LD GR3,IBUF,GR1の命令なのですが、「これはIBUFとGR1のアドレスをたしてGR3にその内容を格納する。」という意味であり、その後(14)で10倍されたGR4にたしています。

質問としては、この2進数に変換するプログラムでGR3とGR4の役割を教えていただきたいです。

GR1はレコードの桁数に使われている領域だとわかります。

個人的な解釈としては、GR4はレコードに入力する10進数の数値なのですが、GR4をなぜ10倍すると2進数に変換されるのかなどやGR3の意味がわからないために全く理解できません。

よろしくお願いします。

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

A 回答 (6件)

2, 5, 3 という 3個の数字をこの順に読んだときに, あなたはどのようにしてこの数字の列が「253 という数値を表す」と理解

しますか?
    • good
    • 0
この回答へのお礼

2を100倍して残す、5を10倍して残す、そして、最後に、
3を含む三つを足します。

お礼日時:2009/05/27 23:58

そういうことだと思います.


123 と 10進文字列で書いてあると「人間には読みやすいけど計算には不向き」なので, 「内部表現としての 2進数」(つまり 123 という数値) に変換する, ということでしょう.
    • good
    • 0
この回答へのお礼

何度も何度も相談いただきありがとうございました。
今後の勉強も頑張っていきたいと思います。

お礼日時:2009/05/29 13:34

ここでやっているのは要するに


「123 という表現を, それが表す数値に変換する」
ということですね. 「10進数」とか「2進数」とかいう表現をしているために, かえって混乱されているのかもしれません.
    • good
    • 0
この回答へのお礼

つまり、123という表現が「10進数」であり
数値に変換すると「2進数」になるという見方でよろしい
のでしょうか。

お礼日時:2009/05/28 23:54

入力はおそらく"123"のような文字列なのでしょう。


「2進数」と言っているのはコンピュータの内部形式を指していると
推測されます。人間が分かる"123"は内部形式では(1111011)bです。
処理内容は左から1桁ずつ数値化し、10倍しながら加算するという
ことです。
A. "1"を数値の1にする(GR3←1)
B. 0(GR4の初期値)を10倍してGR3を足す。(GR4←1)
C. "2"を数値の2にする(GR3←2)
D. 1を10倍してGR3を足す。(GR4←12)
E. "3"を数値の3にする(GR3←3)
F. 12を10倍してGR3を足す。(GR4←123)
ループでなく記述すると以上のようになります。

この回答への補足

そのように処理が行われるということはわかりました。
しかし、このプログラムは10進数を2進数に変換する
プログラムです。(参考書にはそう書いてあります。)
nda23さんの言っていることを解釈すると、これは123
となった時点で2進数に変換されているということで
よろしかったのでしょうか?

補足日時:2009/05/28 22:13
    • good
    • 0

すみません, 意味が分かりません.


・「(10)~(14) でレコードに入力している」というのはどういう意味でしょうか?
・「命令(4)のLD GR0,ILENというもので、GR0に二進数を変換して入力している」とはどういうことでしょうか? 「二進数を変換する」と書かれていますhが, この「二進数」とはなんですか? そして, それを何に変換するんですか?
    • good
    • 0
この回答へのお礼

すみません。
理解不足でした。
私もプログラミング初心者な物で、文字列を入力することで二進数に
変換されるとは知りませんでした。

レコードは文字を入力する領域であり、10倍してGR3を足すことで
レコードに文字列が一つ一つ入力されているのだと思っていました。

そして、レコードに入力された10進数の数値を二進数に変換する
プログラムなので、命令(4)で変換されているのだと思っていました。

おそらく、下記の方が解答されていらっしゃる解釈で問題ないと
思います。3度もかまっていただき、誠にありがとうございました。

お礼日時:2009/05/28 20:29

そう, そしてその計算は


(2×10+5)×10+3
とすることができます.
(10)~(14) では結局
GR4 = GR4×10+GR3
という計算をしていることになります.
この 2つを見比べればわかるのではないでしょうか.
    • good
    • 0
この回答へのお礼

なるほど、(10)~(14) でレコードに入力しているのですね。

では、2進数に変換しているのは、LOOP2内での入力が完了したら
上記の命令(4)のLD GR0,ILENというもので、GR0に二進数を
変換して入力しているという解釈でよろしかったでしょうか。

お礼日時:2009/05/28 01:09

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

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

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

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

Q10進数と2進数の少数の違いについて

10進数の0.1は 1/10 から計算できますが

2進数の0.1の10進法表記は1/2^1で計算して 0.5 ですよね。

整数の場合、10進数も2進数も例えば 1 の大きさはかわらないのに

なぜ少数になると大きさが2進数と10進数で変わってしまうのでしょうか?

 

Aベストアンサー

> 整数の場合、10進数も2進数も例えば 1 の大きさはかわらないのに
> なぜ少数になると大きさが2進数と10進数で変わってしまうのでしょうか?

例えに1を持ってくるから変なのでは?


2進数の10
10進数の10
の大きさが違う理由は説明できますか?

それと同じ理由になると思います。

Q進数変換のプログラムタイトルの由来

進数変換のプログラムのタイトルでは
dec2bin
dec2hex
bin2dec
bin2hex
hex2bin
hex2dec
などのタイトル名を聞きます
dec(10進),bin(2進),hex(16進)なのは分かるのですが、真ん中の"2"の意味がわかりません。このタイトルの由来を知っている方是非教えてください。

Aベストアンサー

英語の慣用表現で2=toです from dec to bin
forを4 youをuなどと書きます

Q16進数から2進数への変換

「Aレジスタに一文字のアスキーコードがあり、これを以下のように二進数に変換してBレジスタに代入する」
Aレジスタ='0’のとき、Bレジスタ=00000000B
Aレジスタ='A’のとき、Bレジスタ=00001010B

この例題に苦戦してます。。
16進数を2進数に変換するアセンブリ言語を教えてください!!

Aベストアンサー

アスキーコードの値と、Bレジに欲しい結果を、一覧表にしてみよう。

'0'=30H→00000000B
'1'=31H→00000001B
'2'=32H→00000010B
  |
'8'=38H→00001000B
'9'=39H→00001001B
'A'=41H→00001010B
'B'=42H→00001011B
  |
'F'=46H→00001111B

さて、Aレジから単純に30Hを引き算したらどうなるだろう?

'0'=30H→00H→00000000B
'1'=31H→01H→00000001B
'2'=32H→02H→00000010B
  |
'8'=38H→08H→00001000B
'9'=39H→09H→00001001B
'A'=41H→11H→00010001B
'B'=42H→12H→00010010B
  |
'F'=46H→16H→00010110B

'0'~'9'までは、目的の値になった。しかし'A'~'F'は、値がズレている。

なので、30Hを引いて、引いた結果が10を超えてたら、もう少し余計に引いてやれば良い。

'A'=41H→11H→0AH→00001010B
'B'=42H→12H→0BH→00001011B
  |
'F'=46H→16H→0FH→00001111B

11Hを0AHにするには、いくつ引けば良いだろうか?

結果、プログラムは以下のようになる。

  Aレジから30Hを引く
  Aレジと0AHをコンペアする
  キャリーが出たら2行下の「ラベル:」に条件ジャンプ
  Aレジから07Hを引く
ラベル:
  AレジをBレジに代入する

あとは、上記の「日本語で書かれたプログラム」を「アセンブリ言語の命令ニモニック」に置き換えるだけ。

因みに、以下のようにすると1命令減りますが、こう解答すると、たぶん×を貰います。

  Aレジから3AHを引く
  キャリーが出たら2行下の「ラベル:」に条件ジャンプ
  Aレジから07Hを引く
ラベル:
  アドレス計算命令で[Aレジ+0AH]をBレジにロードする

蛇足だけど、カテ違いなので、こういう質問は
[技術者向] コンピューター > プログラミング > その他(プログラミング)
のカテに。

アスキーコードの値と、Bレジに欲しい結果を、一覧表にしてみよう。

'0'=30H→00000000B
'1'=31H→00000001B
'2'=32H→00000010B
  |
'8'=38H→00001000B
'9'=39H→00001001B
'A'=41H→00001010B
'B'=42H→00001011B
  |
'F'=46H→00001111B

さて、Aレジから単純に30Hを引き算したらどうなるだろう?

'0'=30H→00H→00000000B
'1'=31H→01H→00000001B
'2'=32H→02H→00000010B
  |
'8'=38H→08H→00001000B
'9'=39H→09H→00001001B
'A'=41H→11H→00010001B
'B'=42H→12H→00010010B
  |
'F'...続きを読む

Qアセンブラ言語の数字を数値に変換するプログラム

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

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

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

Aベストアンサー

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

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

Q2進数の割り算が分かりません・・・。

2進数の割り算が分かりません・・・。
授業でいきなり出てきて大変に戸惑っています。
10010➗11(2進数)
の解き方を教えてください。
よろしくお願いします・・・!

Aベストアンサー

2進数の場合の割り算は引く事が出来るか?をフラグを立てていく感じになります。

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

QHDMI変換ケーブルについて

PCのキャプボに HDMIをそのまま挿せる穴がなかったので

HDMI変換ケーブルというものを買おうと思っていますが

PS3にHDMIケーブルをさして

HDMIケーブルに 赤 白 黄色に変換するHDMI変換コードがあるんですが

この変換ケーブルを通して映像を通した場合

本来HDMI自体で刺した時と違って 画質が落ちたりということはありますか?

Aベストアンサー

>この変換ケーブルを通して映像を通した場合
>本来HDMI自体で刺した時と違って 画質が落ちたりということはありますか?

その変換ケーブルというのが、PS3購入時に付属していたものだとしたら、画質は落ちますね。
HDMI接続だと最大でフルHD(1920×1080)までの映像を出力できますが、付属の変換ケーブルを使った場合は720×480まで画質が低下します。

ちなみに、この問題は変換ケーブルを変えれば何とかなるというものではありません。
解決策としては、フルHD画質とHDMI入力に対応したキャプチャボードに買い替えることですね。
価格的には、安いものでも実売価格で7千円くらいしますし、パソコン側にもある程度高い性能が求められますので、パソコンのスペックによっては使えないかも。
あと、PS3の場合、HDMI出力には著作権保護がかかってますので、一部の製品じゃないと接続しても映像の取り込みが出来ないというのも注意点かな。

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のセグメント:オフセットが入る
== 中略 ==
...続きを読む

Qmp3をwmaに変換するコマンドラインツールを教えてください。

mp3をwmaに変換するコマンドラインツールを教えてください。

あるPodcastをPCでダウンロード後、携帯電話にコピーして、
移動時間等ちょっとした秋時間に携帯電話からそのPodcastを聞こうとしています。
Podcastはmp3で配信されているのですが、私の携帯電話はWMAにしか対応していません。

GUIでMP3をWMAにする方法はいくらでもあるのですが、
Podcastは毎週更新されるので、毎回GUIを手作業で操作するのは面倒です。
できればダウンロード、wma変換を自動に行うようにスクリプトを組みたいのですが
mp3をwmaに変換するコマンドラインツールがみつからずに作業が頓挫しています。
どなたかmp3をwmaに変換するコマンドラインツール(for WindowsXP)をご存知でしたら、おしてください。

Aベストアンサー

コマンドラインツールは詳しくありませんが、WMAのバージョンが古くてもよければffmpegで出来ますよね。
http://blog.k-tai-douga.com/category/359294-1.html
最新版よりもrev.18607辺りが良さそうです。コマンドラインは例えばこんな感じで。

ffmpeg -i test.mp3 -vn -acodec wmav2 -ac 2 -ar 44100 -ab 128k test.wma

詳しくは -h でヘルプをお読み下さい。但しタグが失われますよ。

Windows Media Encoderをインストールして、その中のWMCmd.vbsを使っても出来るのかもしれませんが、当方未確認(当然、MP3デコードは別途必要でしょう)。
http://foobar2000.xrea.jp/index.php?Diskwriter%20%E8%A7%A3%E8%AA%AC#hb296fac

でも、当方は携帯電話で再生などしないしWMPも碌に使ってないのでよく判りませんが、携帯で再生するにはWMPなどでMTPモードでファイルを送るのではないのですか?
もしそうなら、WMPで転送時に形式自動変換出来ませんでしたっけ。当方はMediaMonkeyの有料版なので、転送時の形式自動変換は任意に出来るんですけどね。まあ転送もスクリプトで自動化、ということなら別ですけど。

コマンドラインツールは詳しくありませんが、WMAのバージョンが古くてもよければffmpegで出来ますよね。
http://blog.k-tai-douga.com/category/359294-1.html
最新版よりもrev.18607辺りが良さそうです。コマンドラインは例えばこんな感じで。

ffmpeg -i test.mp3 -vn -acodec wmav2 -ac 2 -ar 44100 -ab 128k test.wma

詳しくは -h でヘルプをお読み下さい。但しタグが失われますよ。

Windows Media Encoderをインストールして、その中のWMCmd.vbsを使っても出来るのかもしれませんが、当方未確認(...続きを読む

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

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


人気Q&Aランキング

おすすめ情報