我試圖創建的真值表爲函數F =(A & B)XOR(C & d')一個真值表。我正在使用英特爾彙編語言,整個代碼必須相當短。創建使用英特爾組件
,我依然會碰到的主要問題是與迴路操縱變量A,B,C和d創建真值表的所有可能的輸入。通常這樣做的方式就像變量都是4位二進制數的一位一樣,並且從0到15計數,實現每個可能的輸入。我只有4個寄存器堆棧和RAM存儲器來完成這個任務,因此我將每個變量分配給一個寄存器,並且我使用RAM來存儲計數器和表格的輸出。我想不出用循環做這件事的好方法,但我必須使用一個,因爲我使用的模擬器不會在代碼生效的情況下用代碼運行。 (這是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
你可以試試pcemu。我有一個叉只是爲了基本的x86彙編http://github.com/dwelch67/pcemu_samples – 2012-03-08 02:46:46
使用一個寄存器並從0到15計數,使用AND和jz或jnz來確定每個位並從那裏開始。有很多解決方案,它不需要太多的代碼或註冊... – 2012-03-08 02:49:21
如果這是一項家庭作業,請添加家庭作業標籤,如果這是x86程序集,請添加x86標籤。 – 2012-03-08 02:49:40