2015-12-29 7 views
0
MVI B 07h 
LXI H 0007h 
LXI D 0007h 
DCR B 
LOOP1: DCR B 
MOV C B 
INR B 
LOOP: DAD D 
DCR C 
JNZ LOOP 
MOV E L 
MOV D H 
DCR B 
JNZ LOOP1 
HLT 

Не удалось найти неисправность в моем коде. Не могли бы вы помочь мне? Это дает мне частично неправильный ответ. Два бита LSB являются правильными, но не MSBs.Программирование на уровне сборки, чтобы найти факториал

+1

Вы можете добавить немного больше информации ? Например, что вы пытаетесь сделать с этим кодом, каков ожидаемый ответ и что пошло не так, как ожидалось? – Ramsharan

+0

Почему бы не попробовать сначала записать его на простой C, а затем перевести его на сборку? – Sam

ответ

1

Я не уверен, почему вы делаете дополнительный декремент (с последующим приращением) на LOOP1 этикетки к B регистру, но когда B одна она вызывает C стать 0, который затем оборачивается вокруг FFh и выполняет цикл умножения еще 255 раз.

Вместо почему вы не вынимать DCR B/INR B и до умножения цикла просто установить H регистр на 0. Полная программа будет выглядеть следующим образом:

MVI B, 07h 
LXI H, 0007h 
LXI D, 0007h 
DCR B 

LOOP1: 
    MOV C, B 
    LXI H, 0 

    LOOP: 
     DAD D 
     DCR C 
     JNZ LOOP 

    MOV E, L 
    MOV D, H 
    DCR B 
    JNZ LOOP1 

HLT 
+0

Мне это очень помогает. На самом деле мой подход к циклу - это нечто иное. Так как пара регистров (H) (L) & (D) (E) содержит одно и то же значение, то для первого случая предположим, что 7, 6 не должно быть добавлено 7 из 7. Таким образом, мы можем запустить цикл в 5 раз с помощью команды DAD D, которая будет служить цели. Но ваш подход проще, и для меня он сталкивается с проблемой, о которой вы говорили ранее. –