Печать четных чисел на ассемблере x86 - PullRequest
0 голосов
/ 19 апреля 2020

Мне удалось написать код для печати номеров ODD. Сейчас я пытаюсь напечатать четные числа, но постоянно я получаю неправильные сообщения. Я не уверен, где я не прав, поскольку я также попробовал команду div. Может кто-нибудь помочь мне в этом исправить. Ниже приведен код.

.MODEL SMALL
.STACK 100H
.DATA
LF EQU '0DH'

.CODE
MAIN PROC
   MOV CX,0001H
   MOV DX,0
BACK: 
   MOV DL, CH
   OR DL, 30H
   MOV AH, 2
   INT 21H
   MOV DL, CL
   OR DL, 30H
   MOV AH, 2
   INT 21H
   CMP CL, 9
   MOV DL, 20H
   MOV AH, 2
   INT 21H
   JGE UNITSREACHED
   ADD CL, 2
   JMP UNITSUNREACHED
UNITSREACHED:
   ADD CH, 1
   MOV CL, 1
   CMP CH , 9
   JG EXIT
UNITSUNREACHED:
   JMP BACK
EXIT:
END MAIN 
MAIN ENDP

1 Ответ

0 голосов
/ 19 апреля 2020
CMP CL, 9
MOV DL, 20H
MOV AH, 2
INT 21H
JGE UNITSREACHED

Вы никогда не должны писать такой код! Обычно этот конкретный вызов int 21h сохраняет флаги, но вы должны держать cmp и jge близко друг к другу.

MOV DL, 20H
MOV AH, 2
INT 21H
CMP CL, 9
JGE UNITSREACHED

Ваш код действительно печатает "01 03 05 07 09 11 13 15 ... ".

Чтобы напечатать четные числа, вам нужно настроить регистр CX на другое значение. Используйте mov cx, 0000h. Вам также необходимо изменить значение, которое вызывает переход, на UNITSREACHED . Теперь это становится 8 (вместо 9). Используйте cmp cl, 8. И в-третьих, не забывайте, что когда вы увеличиваете CH, вам нужно вернуть CL в 0 (а не в 1).

MOV CX,0000H
...
CMP CL, 8
...
MOV CL, 0

Почему бы вам не изменить JMP UNITSUNREACHED в JMP BACK? Вы ничего не получите, прыгая без необходимости.

Точно так же вы можете оптимизировать немного написав:

CMP CH , 9
JNG BACK
...