PIC16F84でのアセンブラなのですが、下記のプログラムで・・・。

MAIN
    MOVLW B'00000000'
    MOVWF PORTB
    BTFSC PORTA,3
    GOTO  FINISH
    GOTO  MAIN
FINISH
    MOVLW B'11111111'
    MOVWF PORTB
    END

PortAが入力、Bが出力なのですが、MAINでループしながら待機、
PortAの3bitめがHになったらPortBをすべて立てて終了という感じに
なると思いますが、上手くいかないんです。

3bit目にあらかじめ+5Vを印加しておくと、一瞬でPortBがすべて立つのですが、
ループ中にやっても何も変化がありません。

ループしていないか、判定ができていないかのどちらかなのですが・・・。

デバッグしてみても、きちんとループ・判定できているのですが
いざ焼いてみると動作しません。わかりますでしょうか。

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

A 回答 (6件)

回路の方はどうなっていますか?


特に入力ピンの処理は行っていますか?

入力ピンが不安定だときちんと動きません。
もし他のPORTAのピンを使っていなのであればGNDなどにおとすか出力ピンに設定してしまいましょう。

+5Vを印加とのことですが5Vをいれる前のPORTA(3)はGNDになっているのでしょうか?
5Vを直接いれるのであれば10KΩ程度の抵抗でPORTA(3)をGNDに接続しておいてスイッチなどで5Vが直接入るようにしてやればいいです。

また、
    CLRF PORTB
MAIN
    BTFSC PORTA,3
    GOTO  FINISH
    GOTO  MAIN
こっちの方が気持ち的にいいかな?
(PORTBにCLRFって使えたっけな?)
    • good
    • 0
この回答へのお礼

ありがとうございます。
入力ピンの設定はできているのですが、どうしてもダメでした。
ループするところでしていんたいので、もしやと思ってクリスタルを抜いてみたら・・・同じ症状でした。

すみません、発振部分がイカれていたようです。
なんとか正常に動作させることができました。お騒がせして申し訳ありません。

お礼日時:2001/06/25 15:43

\(^o^)/コンバンワ!!



IMUSAI時代から、TK80を経て現在まで現役で仕事をしています。
アセンブラなどは懐かしく思い、ついチョッカイを書いてみました。

PICなど秋月電気通商さんなどで売っているあれ?でしょうか?

PICは使った事ありませんので、知りませんが予測してみますのでチャレンジしてみて下さい。

【ご質問の整理】
ご質問のビットを確認しているのだが、分岐で実行されない。と言う事ですね。

【根本原因】
フラグがたたないので分岐しないと思われます。

80系のCPUは、MOV命令などで値を移動しても、移動した数値によりフラグレジスターは変化しません。
68系のMPUは、MOV命令などで数値を移動するだけで、フラグレジスターに変化が表れます。

このPICはどうやら68系CPUみたいですね。

BTFSC PORTA,3 の命令を
BTFSS PORTA,3 に変更してみて下さい。

PORTAの3ビット目が、trueであれば、次の命令をスキップする。と言う事になり、目的が果たせるかと思われます。

我々の時代は、ICEと言うものを使ってCPU自体をシュミレートするマシンを使って、メインボードなどのハードウエア欠陥を治したものです。あの頃が懐かしい。

PICのニューモニック一覧表を添付しておきました。

楽しいPICライフを過ごせると良いですね。

参考URL:http://www.phys.waseda.ac.jp/shalab/~riku/resear …
    • good
    • 0
この回答へのお礼

このPICは、ビットのH/Lで単純分岐してくれるので、フラグは考えなくても良いようです。
プログラムには誤りが無いようなんですが(デバッグokでした)、原因は発振部分の不良により、プログラムカウンタが進んでいなかったようです。
お騒がせして申し訳ありません。ありがとうございました。

お礼日時:2001/06/25 15:47

プログラムにおかしいところはないように見えます。



PORTAのI/Oの設定をしていない。
配線が間違っている。
シリアル通信でON=1と思い込んでいる。

などが考えられます。
シリアル通信ではON=1のときと、ON=0のときがありますよね。
たとえば、PCとWonderSwanが逆だということに気付かないと...
って、それは私のことです(^^;)。

PORTAの入出力を設定しているところを数行見せてください。

この回答への補足

デバッガでは問題なかったのでハード的なものかと思ったのですが、正にその通りでした。(T_T)
クリスタルにつけたコンデンサの不良で、発振されていなかったようです。交換したら無事に動作しました。お騒がせしてすみません・・・。

補足日時:2001/06/25 15:47
    • good
    • 0

PORTAの初期化を行っていないようですが大丈夫でしょうか?


よく分かっていないのですが、レジスタのアドレスを初期化で入れるのではないでしょうか?
違っていたら、ごめんなさい。

この回答への補足

初期化として、入出力のモードを設定、出力データを設定というのが必要なのですが、
とりあえずPortAは入力に指定し、出力はしないので初期値は0としてあります。
う~ん、お手上げかもしれません・・・。(笑)
お手を煩わせてしまって申し訳ありません。

補足日時:2001/06/23 01:09
    • good
    • 0

BTFSCを調べた所オペランドのビット指定が0~7と成っています。


プログラムで3を指定していると言う事は、4番目のビットになるのではないでしょうか?


BTFSC
f レジスタ の指定ビットが 0 なら次の命令をスキップ

書式
[label]BTFSCf, b( label は省略可 はスペースを示す )

オペランド
f:ファイル・レジスタのアドレス ( 00(00h) ~ 127(7Fh) )
b:ビット指定 ( 0 ~ 7 )

この回答への補足

ありがとうございます。一通りの入力ピンを試してみたのですが、だめでした。
リセット時初からHiになっている時のみ正しく動くのですが、やはりハードウェア側がおかしいのでしょうか・・・。

補足日時:2001/06/22 23:10
    • good
    • 0

すみません。


回答では無いです。

PICアセンブラがどのくらい有名なのかわからないのですが、
アセンブラを知っていてもPICアセンブラを知らない人も多いと思います。
PICアセンブラの説明も載っていれば、回答出来る人が増えると思いますが。

例えばBTFSCのコマンドの説明です。
それがわかれば、なぜGOTO文が2つ並んでいるのか分かるのでしょうか?
    GOTO  FINISH
    GOTO  MAIN

この回答への補足

そうですね。お手数をおかけしてすみません。

MOVLW B'00000000'
0hをWReg(作業領域)にコピーします。

MOVWF PORTB
Wregの内容をPORTBに移動します。

これで、マイコンのポートB(出力用/8bit)のビットをすべて0にします。

BTFSC PORTA,3
ポートA(入力用)の3ビット目を見て、0だったら直後の命令をスキップします。

GOTO  FINISH
GOTO  MAIN
1だったらFINISHにジャンプ、それ以外はループ続行です。

FINISH
内では、同じように出力ビットをすべて立てて終了します。

ということなのですが・・・。
5V駆動なので、この3bit目に5Vを入れたりGNDに落としたりしているのですが、ダメでした・・・。(汗)

補足日時:2001/06/22 20:41
    • 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的機能)が含まれているかという質問です。

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

Qバッチファイル goto前の表示のクリア

バッチファイルでgoto前の表示のクリアしたいです。
どうしたらよいでしょうか?
●記述:
:Select
echo 選択_______
echo 1 --- 1です
echo 2 --- 2です
echo 0 --- 終了
set /P Res="入力 >>>>>>> "
if "%Res%"=="1" goto 1
if "%Res%"=="2" goto 2
if "%Res%"=="0" goto END
goto Select
:1
echo.
echo 111
echo.
goto SELECT
:2
echo.
echo 222
goto SELECT
●結果:
選択_______
1 --- 1です
2 --- 2です
0 --- 終了
入力 >>>>>>>1

111

選択_______
1 --- 1です
2 --- 2です
0 --- 終了
入力 >>>>>>>
●入力後表示したい文字列(以下だけ):
選択_______
1 --- 1です
2 --- 2です
0 --- 終了
入力 >>>>>>>

バッチファイルでgoto前の表示のクリアしたいです。
どうしたらよいでしょうか?
●記述:
:Select
echo 選択_______
echo 1 --- 1です
echo 2 --- 2です
echo 0 --- 終了
set /P Res="入力 >>>>>>> "
if "%Res%"=="1" goto 1
if "%Res%"=="2" goto 2
if "%Res%"=="0" goto END
goto Select
:1
echo.
echo 111
echo.
goto SELECT
:2
echo.
echo 222
goto SELECT
●結果:
選択_______
1 --- 1です
2 --- 2です
0 --- 終了
入力 >>>>>>>1

111

選択_______
1 --- 1です
2 --- 2で...続きを読む

Aベストアンサー

clsコマンドでよいですね。
参考
http://hisa-net.ddo.jp/php/dos/dos_command.php

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

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

Aベストアンサー

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

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

QBTFSC 分岐命令の不思議

PIC アセンブラを勉強し始めたばかりの者です。今あるモノを PIC16F886 で作っています。

PORTB 変化割り込み機能を使い、スイッチ RB7 が H→L で割り込みが掛かるようにしました。
そのルーチンの中で、スイッチフラグ変数 F_SW を

MOVLW1
XORWFF_SW,F

のように押されるたびに反転します。

次に

BTFSCF_SW,0
BSFPORTC,3
BCFPORTC,3

のようにしてフラグの状態によって RC3 を H にしたり L にしたいんですが、これが上手く動作しないのです。

試しにシミュレーションで 1 ステップづつ確かめてみると、F_SW = 1 だと BTFSC の次の行、0 だと 1 つ先にジャンプします。 ここまでは良いのです。

ところが、F_SW = 1 の場合、

BSFPORTC,3

に行って RC3 が H になったあと、次のステップでなぜか L に戻るのです。 これを発見するまで 3 日ほど悩みました。

ふと思い、以下のようにすると思い通りの動作をしてくれるようになりました。

BTFSCF_SW,0
GOTOHANDAN_ON
GOTOHANDAN_OFF

HANDAN_ON
BSFPORTC,3 ; 制御 ON
GOTOINTR_END
HANDAN_OFF
BCFPORTC,3 ; 制御 OFF

; 割り込み終了
INTR_END

なぜなんでしょう?

PIC アセンブラを勉強し始めたばかりの者です。今あるモノを PIC16F886 で作っています。

PORTB 変化割り込み機能を使い、スイッチ RB7 が H→L で割り込みが掛かるようにしました。
そのルーチンの中で、スイッチフラグ変数 F_SW を

MOVLW1
XORWFF_SW,F

のように押されるたびに反転します。

次に

BTFSCF_SW,0
BSFPORTC,3
BCFPORTC,3

のようにしてフラグの状態によって RC3 を H にしたり L にしたいんですが、これが上手く動作しないのです。

試しにシミュレーションで 1 ステップづつ確かめてみると、F_SW...続きを読む

Aベストアンサー

詳しくないですが。

(1)BTFSCF_SW,0
(2)BSFPORTC,3
(3)BCFPORTC,3

F_SWのbit0が0 の 時は (2)をスキップする。つまり(1)→(3)
F_SWのbit0が1 の 時は (2)をスキップしない。つまり(1)→(2)→(3)
つまり、どっちの場合も(3)によりクリアされる。

という事だと思いますが。

>RC3 が H になったあと、次のステップでなぜか L に戻るのです。
次のステップは Low にする命令だから、でしょう。

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

QAccessVBAで実行時エラー'429'が出ます

ACCESS2000,WindouwsME
ACCESSから既存のEXCELブックを呼び出そうとしていますが、
  
       略
EXCEL名 = S2 & "XXX.xls"
Set xls = GetObject(EXCEL名, "Excel.Sheet")
       略

の、2行目で以下のエラーが出てしまい困っています。

実行時エラー'429'
ActiveXコンポーネントはオブジェクトを作成できません。

動かすパソコンの環境で、出る時と出ない時があるようです。
VBEのツールメニューから参照設定を確認しているつもりですが、
ここの理解も含めて原因が良くつかめません。
解決策をコメントできる方がおられましたらお願いいたします。

Aベストアンサー

参考になるようなURLを見つけました。
http://moug.excite.co.jp/skillup/opm/opm05-05.htm
「すでにWordが起動しているときにはそのまま処理を続行しますが、未起動のときには番号429のエラーが発生します。」
ただし自作テストで
Sub test01()
Dim x As Object
Set x = GetObject("c:\My Documents\aa1.xls")
x.Activate
With activeworkbook
MsgBox x.worksheets("sheet1").range("a1").Value
End With
Set x = Nothing
End Subでテストすると、その時エクセルを起動していないがうまく行きました。
ただAccessのモジュールの画面でツール-参照設定-MicrosoftExcel9.0ObjectLibraryにチェックを入れて
いますが。

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

QWindows2008環境 'DATE /t'

いつも大変御世話になっております。

Windows2008環境で以下構文が入ったバッチを稼動予定です。

FOR /F "tokens=1 delims= " %%i in ('DATE /t') do SET TEST=%%i
Echo %TEST%

上記場合、Windows2000・2003では "YYYY/MM/DD"が表示されます。
※YYYY:当年 MM:当月 DD:当日

Windows2008でも表示可能でしょうか?

Windows2008がないので、どうしても検証ができません。

もしご存知の方がいらっしゃるようでしたら、お手数ですが
実現可能かどうかをご回答願いますでしょうか?

以上、何卒宜しくお願い致します。

Aベストアンサー

Windows Server 2008 R2で確認しましたが、日本語版の初期状態であれば同じ表示になりました。
ただし、コントロールパネルで表示形式は変更できます。
また、単に日付を取得したいだけなら、環境変数DATEを参照するだけで済みます。

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

Q64bitのwindowsサーバーで32bit用のコマンドを使用する場

64bitのwindowsサーバーで32bit用のコマンドを使用する場合

こんにちは。はじめまして。
64bit版widowsサーバーで32bitでしか動かないプログラムをバッチで走らせたいのですがどう設定すれば良いのでしょうか。
c:\windows\syswow64\cmd.exeでコマンドプロンプトを開いてそこでプログラムを走らせると起動します。これをバッチファイルで起動する様にしたいです。
どなたか分かる方教えて下さい。

よろしくお願いします。

Aベストアンサー

>c:\windows\syswow64\cmd.exeでコマンドプロンプトを開いてそこでプログラムを走らせると起動します。

ここまで判っていれば答えは見えているように思います。
32bit用のバッチファイルを

c:\windows\syswow64\cmd.exe /C バッチファイル名.bat

として起動するような別の起動用バッチを作成すればいいと思います。
PROCESSOR_ARCHITECTURE環境変数を使用すれば自動的に判断するようなバッチを作ることも可能だと思います。

同じバッチファイル内にx64とx86のプログラム呼び出しが混在する場合は、同じコマンドインタプリタのインスタンス内では無理だと思います。
別のインスタンスで起動しても良ければ

c:\windows\syswow64\cmd.exe /C プログラム名

のように32bit呼び出し部分だけ別のコマンドインタプリタで起動するようにバッチを記述すればいいのではないかと思います。
cmd.exeのオプションについてはヘルプを参照して下さい。


人気Q&Aランキング

おすすめ情報