x86のJP命令について

このQ&Aのポイント
  • JP命令は、演算後の1のビット数が偶数の時にセットされる特殊な命令です。
  • 質問者はZ-1GRでx86アセンブリを勉強中で、以下のコードを実行した際にJP命令の動作に疑問を持っています。
  • コードを見ると、JP命令によってBXレジスタに1が格納されるはずですが、なぜ格納されないのか疑問です。
回答を見る
  • ベストアンサー

x86のJP命令について。

いつもお世話になっております。 小生、現在CASIOのポケコンZ-1GRにて、 x86アセンブリを勉強中のアセンブリ初心者です。 今回、先輩方にご質問させて頂きたいのは、 JP命令についてです。 まず、以下のコードを見てください。 ORG 2000H START: MOV AX,08888H XOR BX,BX MOV DX,00888H MAIN: AND DX,AX JP SETBX JMP RETURN SETBX: MOV BX,0001H RETURN: IRET END と記述し、アセンブル→実行しますと、BXに1が格納されます。 JP命令というのは、演算後、1のビット数が偶数の時にセットされるもので、 上記のコードだと、DXは0888のままなので、1のビット数は奇数でRETURNにジャンプするはずだと思うのですが。。。 お忙しい中、大変申し訳ございませんが、先輩方、ご教授宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

Intel のドキュメントによると, PF は 「結果の最下位バイトに値 1 のビットが偶数個含まれている」場合 にセットされるらしいよ.

参考URL:
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol1_Online_i.pdf
HackHack
質問者

お礼

Tacosanさん、本当にいつもご回答頂き誠にありがとうございます。 先程、Tacosanさんから頂いたご教示のもと、 以下のコードを記述し、実験してみました。 ORG 2000H START: MOV AX,08888H XOR BX,BX MOV DX,08808H MAIN: AND DX,AX JP BXSET JMP RETURN BXSET: MOV BL,01H RETURN: IRET END と記述し→実行すると、見事!!!!BXには1という値は格納されませんでした。 やっと、頭がスッキリしました。 本当に感謝申し上げます。 ありがとうございました。

HackHack
質問者

補足

Tacosanさん、いつもご回答頂き誠にありがとうございます。 IntelのIA-32デベロッパーズマニュアル、非常に助かりました。 >「結果の最下位バイトに値 1 のビットが偶数個含まれている」場合 という事は私の記述したコードに当てはめると、 DLに値1のビットが偶数個ある為、BXに値が入っていたんですね。 もう少し、検証コードを書いてから、実験してみたいと思います。 この度は、ご回答頂き、誠に感謝申し上げます。

関連するQ&A

  • CASIOのポケコンZ-1GRのRET命令について。

    CASIOのポケコンZ-1GRのRET命令について。 いつもお世話になっております。 小生、現在CASIOのポケコンZ-1GRにて8086アセンブリを勉強している、 アセンブリ初心者です。 今回質問させて頂きたいのは、Z-1GRのアセンブリでラベル内にRET命令を記述し、 アセンブル、実行するとZ-1GRが終了してしまう現象についてです。 再現手順は以下のようになります。 1.Z-1GRを起動。 2.CREAR ,200と入力し、エンターキー押下。 3.menuキー押下し、メニュー画面を表示。 4.キー5を押下し、アセンブリモードに推移。 5.キーSを押下し、エディタを起動。 6.下記のプログラムを記述 ORG 2000H START: MOV AX, 0001H MOV DX, 000FH CMP AX,DX JC LABEL_1 MOV CX, 000FH JMP EXIT LABEL_1: MOV CX,0001H RET EXIT: IRET END 7.Shift+menuキーでアセンブリモードに推移。 8.キーAでアセンブル。 9.アセンブル完了画面が表示される。 10.BRKキー押下、monと入力、エンターキー押下。 11.デバッグ画面に推移し、G2000 ,2014と入力しエンターキー押下。 12.Z-1GRが終了する。 以上です。 もしかして、Z-1GRの仕様でラベル内ではRET命令を使えない事になっているのでしょうか? お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。

  • アセンブリ:FCのファイルオープンについて

    アセンブリ:FCのファイルオープンについて ファイルオープンのファンクションコールについて質問させてください。 うまく伝えられるか不安なので、いま陥っている現象を順番に書かせていただきます。 まずエディタで、 ---------------------------------- MOV AH , 3DH MOV AL , 00H MOV DX , offset FNAME INT 21H FNAME DB 'C:\xyz.txt',00H ---------------------------------- という簡易なプログラムを記述しました(擬似命令は省いています) これをアセンブルすると、 --------------------------------------- CS:0100 B43D MOV AH,3D CS:0102 B000 MOV AL,00 CS:0104 BA0901 MOV DX,0109 (*注) CS:0107 CD21 INT 21 CS:0109 43 INC BX ・ ・ --------------------------------  となるのですが、このとき AX=0003  CY となり、ファイルオープンに失敗してしまいます。 理由がまったくわからないので、デバックの直打ちで 0200 DB 'C:\xyz.txt' と格納してから、(*注)である命令を MOV DX,0200 に打ちかえれば、 AX=0005  NC となって無事にオープンできるみたいです。 なお、ファイルオープンに限らず、ファイル作成でも同じでした。 エディタでアセンブル( DX , 0109 ) だと失敗し、 デバッグ直打ち( DX , 0200 ) だと成功します。 これはいったい、どういう理由からなのでしょうか? 何冊か本を読んでみたのですが、書かれているのはコードの記述のみなので困っています。 わかる方がおられましたら、ご教授ください。 WINXP:MASM32で行っています。

  • NASM(独習アセンブラのサンプルソース)について

    独習アセンブラ初版5刷のサンプルソース(リスト6.7、102p)での疑問です 下の方にあるコメントアウトしているputc関数って何のためにあるんですか? どこからも呼び出してないのでいらないと思うのですが… アセンブラはNASMです ※本に書かれてるソースはコメントアウトしてません、コメントアウトしてもアセンブルできました bits 16 org 100h mov dx,sfile mov al,0 mov ah,3dh int 21h jc endquit mov [ifh],ax mov dx,dfile mov cx,0 mov ah,3ch int 21h jc endquit mov [ofh],ax readb: mov bx,[ifh] mov dx,buf mov cx,1 mov ah,3fh int 21h test cx,ax jz endquit jc endquit mov bx,[ofh] mov dx,buf mov cx,1 mov ah,40h int 21h jmp readb endquit: mov bx,[ifh] mov ah,3eh int 21h mov bx,[ofh] mov ah,3eh int 21h mov ax,4c00h int 21h ;putc: ; push ax ; mov ah,2h ; int 21h ; pop ax ; ret ifh dw 0 ofh dw 0 sfile db "srcfile.txt",0 dfile db "destfile.txt",0 buf resb 2 私が思うにリスト6.6(100p)のreadbラベルのところでこれを呼び出してるのでソースを流用して消し忘れてるだけなんでしょうか?

  • レジスタが変化しない アセンブリ

    アセンブリ言語の勉強を始めた者なのですが レジスタの値が普通のMOV命令で変化しません。 何か初歩的なミスを犯しているのでしょうか、どなたかご教示願います。 環境はXPSP3,Core2DuoE8500に、コマンドプロンプトからDEBUGコマンドを使って学習しています。 0100:MOV ax,FF 0103:(空白) -G 100 103 として実行してみるのですがAXレジスタ内の値が0000のまま変化しないのです。 昨日やったときは普通に出来たような気がしたのですが、、 命令を MOV ax,0222 MOV bx,0222 としたときのスクリーンショットを撮ってみましたので付けておきました。 何かきっと初歩的なミスだと思うのですが、どなたかお願いいたします・・。

  • 情報の問題

    インターネットで調べたのですが下の問題が解けるようになりません。 解答を見ればなんとなく理解できる気がするので、どなたか解答お願いします。 (1)32ビット符号なし整数がDX_AXレジスタに与えられているとき、この値を2倍したものを、再びDX_AXレジスタに求める命令をかけ。ただし、オーバーフローは考えなくてよい。 (2)2つの32ビット整数a,bがDX_AX,CX_BXレジスタに与えられているとき、a-bの値を求め再びDX_AXレジスタに代入する命令を示しなさい。

  • アセンブラできません。

    初心者です。 アセンブリ言語で1~9の数字を連続的に表示するプログラムを書いたのですが、アセンブラする時 「error A2016 expression expected」というエラーメッセージが出てアセンブラすることができません。 プログラムの内容は下記↓のものです。 何が原因でしょうか? CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov bl,30h jmp aa aa: mov ah,02h mov dl,bl int 21h mov ah,06h mov dl,0ffh int 21h jnz bb: mov ah,02h mov dl,08h int 21h inc bl cmp bl,39h ja START jmp aa bb: int 20h CODE ENDS END START

  • 文字を表示するファンクションコールについて

    アセンブリ言語プログラムについての質問です。 MASM32を使っています。AXレジスタの数値をah→表示、al→表示というプログラムを作ったのですが、al→表示の部分がうまく機能しせません。以下にプログラムを書きます。 (1)mov ax,3132h (2)mov dl,ah (3)mov ah,02h (4)int 21h (5)mov dl,al (6)mov ah,02h (7)int 21h (分かりやすく番号をふっています。実際のプログラムには番号はふっていないです。) 具体的どこが機能しないかというと、(5)番目の命令のalレジスタの内容をdlレジスタに転送するという命令が機能しません。デバックのT命令で確認したところ(5)番目の命令がNOPとなっていました。 このプログラムを実行すると結果的に表示されるのは「11」という文字です。(本来は12と表示したい。) 質問 なぜ(5)番目の命令がnopとなるのでしょうか?

  • NASMアセンブリのセクションについてご教示ください。

    NASMアセンブリのセクションについてご教示ください。 いつもお世話になっております。 前回も大変勉強になるご教示頂き誠に、感謝申し上げます。 小生、只今WinXPSP3上でNASM0.99.06を使用し、アセンブリ言語を勉強しています。 今回質問させて頂きたいのはNASMによる、セクションです。 NASMでは.text, .bss, .dataセクションがありますが、 例えば下記のアセンブリソースの、 一番最初に記述する[org 0]なども広義の意味でのセクションに該当するのでしょうか? ソースは以下の様になっております。 -----source.asm----- [org 0] [bits 16] jmp 0x07C0:start start: mov ax, cs mov ds, ax mov ax, 0xB800 mov es, ax mov di, 0 mov ax, word [msgBack] mov cx, 0x7FF paint: mov word [es:di], ax add di, 2 dec cx jnz paint mov edi, 0 mov byte [es:edi], 'A' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], 'B' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], 'C' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], '1' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], '2' inc edi mov byte [es:edi], 0x06 inc edi mov byte [es:edi], '3' inc edi mov byte [es:edi], 0x06 jmp $ msgBack db '.', 0xE7 times 510-($-$$) db 0 dw 0xAA55 -------------------------- 以上です。 最後から2行目の箇所に$$の特殊シンボルが使われており、 私としてはセクション(.textセクション等)が記述されていないのに、 $$はどこのセクションを示しているのかが分かりません。 そこで、書籍などで調べてみたところ、セクションとはそのコードがどこに置かれるかを決めるもので、 上記に記述させて頂いたコードだと、[org 0]がある為、 このコードは0000 0000に配置される事になり、 $$は0000 0000を指し示すものだと思っています。 この解釈で間違っていないでしょうか? お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。

  • マシン語(MS-DOS)の実行過程がわかりません

    LSI C-86 Ver 3.30 試食版を利用して、「hello, world」を表示するプログラムをコンパイルしました。 出来上がったhello.exeがどのように実行されるのか知りたくて、SYMDEBコマンドでステップ実行してみることにしました。 その前にバイナリエディタでhello.exeを開くと、ヘッダは512バイトあり、200hからは最初のマシン語命令「B8 8B 02」が確認できました。 アセンブリ言語では「MOV AX,028Bh」となり、AXレジスタに028Bhがセットされるはずです。 しかし、実際にエミュレータ上で「SYMDEB hello.exe」実行してみると、次のような結果になりました。 -------------------- Microsoft (R) Symbolic Debug Utility Version 4.00 Copyright (C) Microsoft Corp 1984, 1985. All rights reserved. Processor is [8086] -r AX=4B01 BX=0000 CX=2CC1 DX=0000 SP=09C4 BP=0000 SI=0000 DI=0000 DS=117A ES=117A SS=146E CS=118A IP=0000 NV UP EI PL NZ NA PO NC 118A:0000 B81514 MOV AX,1415 -u 118A:0003 8ED0 MOV SS,AX 118A:0005 BC540F MOV SP,0F54 118A:0008 368C1E5800 MOV SS:[0058],DS 118A:000D B430 MOV AH,30 ;'0' 118A:000F CD21 INT 21 118A:0011 36A34500 MOV SS:[0045],AX 118A:0015 8A1E8000 MOV BL,[0080] 118A:0019 32FF XOR BH,BH -------------------- 最初のマシン語命令が、「MOV AX,1415」と書き換わっています。以降の命令はバイナリエディタで見た通りのようです。 なぜ最初の命令が書き換わってしまうのでしょうか?

  • 8086アセンブラで、メモリ間のデータをストリング命令でブロック転送したい

    ソースが長めなので、簡潔に書きます。ご無礼の段、ご容赦ください。 【目的】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]; であろうか…。 識者の方、よろしくお願いいたします。気になって夜も眠れません。