Я пытаюсь создать таблицу истинности для функции F = (A & B) XOR (C & D ').Я использую язык ассемблера Intel, и весь код должен быть довольно коротким.
Основная проблема, с которой я продолжаю сталкиваться, заключается в цикле манипулирования переменными A, B, C и D для создания всехвозможные входы таблицы истинности.Обычно это делается так, чтобы каждая переменная представляла собой бит 4-битного двоичного числа и считала от 0 до 15, реализуя каждый возможный вход.У меня есть только 4 регистра стека и оперативной памяти для этого, поэтому я назначил каждую переменную в регистр, и я использую оперативную память для хранения счетчика и выходных данных таблицы.Я не могу придумать хороший способ сделать это с помощью цикла, но я должен использовать его, потому что симулятор, который я использую, не будет работать с кодом, пока мой стал.(Это 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