2012-03-08 16 views
1

関数F =(A & B)XOR(C & D ')の真理値表を作成しようとしています。私はIntelのアセンブリ言語を使用しています。コード全体がかなり短くなければなりません。インテグラアセンブリを使用した真理値表の作成

私が実行し続ける主な問題は、変数A、B、CおよびDを操作して真理値表の可能なすべての入力を作成するループです。これが通常行われる方法は、変数がそれぞれ4ビットの2進数のビットであり、0から15までカウントし、各可能な入力を実装するように動作することです。私はこれを達成するためにスタックとRAMメモリを4つしか持っていないので、各変数をレジスタに割り当て、ラムを使ってカウンタとテーブルの出力を格納します。私はループでこれを行う良い方法は考えられませんが、私が使用しているシミュレータは私のものと同じコードでは機能しないので、1つ使用しなければなりません。 (それは256バイトです)

ここでコードですが、プロシージャ60と呼ばれるサブルーチンは、凝縮したい部分です。真実のテーブルを実際に出力する必要はなく、「Minterm's」(1の出力)がどれくらい多く生成されたかを伝えるだけです。

 ;MAIN 
    MOV AL,0 ;INITIALIZING VARIABLES 
    MOV BL,0 
    MOV CL,0 
    MOV DL,0 
    MOV [20],AL ;INITIALIZE CURRENT NUMBER OF MINTERMS WITH 0 
    MOV [21],AL ;INITIALIZE COUNTER WITH 0 
LOOP: CALL 30 
    CALL 60 
    MOV [21],CL 
    CMP CL,15 
    JS LOOP 
    CALL E0 
    MOV AL,[20] ;MOVE NUMBER OF MINTERMS TO AL 
    MOV [FF],AL ;OUPUT NUMBER OF MINTERMS TO VDU(LOCATIONS [C0] TO [FF]) 

     ;PROCEDURE 30, IMPLEMENTS THE GIVEN BOOLEAN FUNCTION 
    ORG 30 ;WRITE CODE BEGINNING AT [30] 
    PUSH DL ;CURRENT VALUE OF D 
    PUSH CL ;CURRENT VALUE OF C 
    PUSH AL ;CURRENT VALUE OF A, IMPLEMENTING FUNCTION WON'T CHANGE D 
    AND AL,BL ;PERFORMS (AL AND BL), STORES VALUE IN AL 
    NOT DL ;INVERSE OF DL STORED IN DL 
    AND CL,DL ;PERFORMS (CL AND DL), STORES VALUE IN CL 
    XOR AL,CL ;PERFORMS (AL XOR CL), STORES VALUE IN AL 
    MOV BL,[20] ;MOVES CURRENT NUMBER OF MINTERMS TO BL 
    ADD AL,BL ;ADD TO CURRENT NUMBER OF MINTERMS IF MINTERM RESULTED FROM FUNCTION 
    MOV [20],AL ;STORE NEW CURRENT NUMBER OF MINTERMS 
    MOV CL,[21] ;MOVE COUNTER TO CL 
    INC CL ;INCREMENT CL, INCREMENTING COUNTER 
    MOV [21],CL ;MOVE NEW VALUE OF COUNTER 
    POP AL ;RESTORE PREVIOUS VALUE OF D 
    POP CL ;RESTORE PREVIOUS VALUE OF C 
    POP DL ;RESTORE PREVIOUS VALUE OF A 
    RET 

     ;PROCEDURE 60, MANIPULATES VARIABLES TO IMPLEMENT FULL TRUTH TABLE 
    ORG 60 ;WRITE CODE BEGINNING AT [60] 
    MOV CL,[21] ;MOVE COUNTER VALUE TO CL REGISTER 
    CMP CL,1 ;NEED TO MAKE THIS INTO A LOOP 
    JZ FIRST 
    CMP CL,2 
    JZ SECOND 
    CMP CL,3 
    JZ FIRST 
    CMP CL,4 
    JZ FOURTH 
    CMP CL,5 
    JZ FIRST 
    CMP CL,6 
    JZ SECOND 
    CMP CL,7 
    JZ FIRST 
    CMP CL,8 
    JZ EIGHTH 
    CMP CL,9 
    JZ FIRST 
    CMP CL,10 
    JZ SECOND 
    CMP CL,11 
    JZ FIRST 
    CMP CL,12 
    JZ FOURTH 
    CMP CL,13 
    JZ FIRST 
    CMP CL,14 
    JZ SECOND 
    CMP CL,15 
    JZ FIRST 
    JMP LAST 
FIRST: 
    MOV AL,1 
    JMP LAST 
SECOND: 
    MOV AL,0 
    MOV BL,1 
    JMP LAST 
FOURTH: 
    MOV AL,0 
    MOV BL,0 
    MOV CL,1 
    JMP LAST 
EIGHTH: 
    MOV AL,0 
    MOV BL,0 
    MOV CL,0 
    MOV DL,1 
    JMP LAST 
LAST: 
    RET 

     FINISH: 
    ORG E0    ;WRITE CODE BEGINNING AT E0(OUTPUTS TO VDU) 
    DB "The number of Minterms in F is" ;OUTPUT STATEMENT 
    RET 

     END 
+0

間違っている場合は、pcemuを試すことができ、私を修正します。私は基本的なx86アセンブリのためだけにforkを持っています。http://github.com/dwelch67/pcemu_samples –

+0

1つのレジスタを使用し、0から15までカウントします。ANDとjzまたはjnzを使用して各ビットを決定し、そこから進みます。これには多くの解決策があります。多くのコードやレジスタを取ることはありません... –

+0

これは宿題です。宿題タグを追加してください。x86アセンブリの場合は、x86タグを追加してください。 –

答えて

2

どのように単にについて:

mov cl, 0 ; CL contains DCBA bits 
L: 
mov bl, cl ; BL contains DCBAb 
and bl, 101b ; BL contains 0C0Ab 
mov al, cl ; AL contains DCBAb 
shr al, 1 ; AL contains 0DCBb 
and al, 101b ; AL contains 0D0Bb 
and bl, al ; BL contains 0(C&D)0(A&B)b 
mov al, bl ; AL contains 0(C&D)0(A&B)b 
and bl, 1 ; BL contains 000(A&B)b 
shr al, 2 ; AL contains 000(C&D)b 
xor al, bl ; AL contains 000((C&D) XOR (A&B))b 
inc cl ; increment DCBA as a 4-bit number 
cmp cl, 16 ; all 16 combinations? 
jne L ; not yet, repeat 
0
xor cx,cx    ; init counter register 
repeatLoop: 
mov al,cx    ; bits a,b,c and d in lowest 4 nibbles 
call processtruthtable 
inc cx 
cmp cx,16    ; 4bits so 16 possibilities 
jl repeatLoop 
jmp exitProgram 
processtruthtable: 
.... 
.... 
.... 
.... 
ret 
exitProgram: 
// whatever OS you use, use the exit INT call 
for dos it's INT21/4C 
for linux it's INT80/01 
part after/is to be stored in AH 

は私が

+0

カウンターを使うことは、アレクセイが既に提案しているのと同じ答えです。そして、私はあなたが「最下位の4ビット」、すなわち「最下位の1ニブル」を意味していたと思う。なぜなら、16ビットワードは合計わずか4ニブルでしかないからだ。 –

関連する問題