Как увеличить переменную в сборке? - PullRequest
2 голосов
/ 14 февраля 2020

Мне нужно создать программу сборки, которая печатает: 0 01 012 0123 ... 0123456789 Кажется, мне нужно создать переменную, которую я могу увеличивать, чтобы остановить код, как только я доберусь до него, чтобы я мог go назад и начнем снова, это моя попытка до сих пор. Я уже могу заставить его напечатать 0123456789 десять раз, но проблема в том, чтобы заставить его подсчитать. Вот этот код

.MODEL MEDIUM
.STACK
.DATA
number DB 1
.CODE
.STARTUP
 mov bl,10
nextline: mov dl,'0' ; '0' is ASCII 48
nextchar: mov ah,02h ; print ASCII char in dl
 int 021h
 inc dl
 cmp dl,':';‘:' is ASCII for 10
 jnz nextchar

 push dx ; save value of dl and dh on stack
 mov ah,02h ; print ASCII char in dl
 mov dl,13 ; carriage return (move to start of line)
 int 021h
 mov dl,10 ; line feed (next line)
int 021h
 pop dx ; restore value in dl (and dh)
 dec bl
 jnz nextline
 .EXIT
END

А вот моя попытка подсчитать его, возможно, я еще не до конца понимаю, как работают переменные

.MODEL MEDIUM
.STACK
.DATA
number DB '1' ;changed from 1 to '1'
.CODE
.STARTUP
 mov bl,10
nextline: mov dl,'0' ; '0' is ASCII 48
nextchar: mov ah,02h ; print ASCII char in dl
 int 021h
 inc dl
 cmp dl,number;‘:' is ASCII for 10
 jnz nextchar

 push dx ; save value of dl and dh on stack
 mov ah,02h ; print ASCII char in dl
 mov dl,13 ; carriage return (move to start of line)
 int 021h
 mov dl,10 ; line feed (next line)
int 021h
 pop dx ; restore value in dl (and dh)
 dec bl
 add number,1 ;moved to outer loop
 jnz nextline
 .EXIT
END

1 Ответ

0 голосов
/ 15 февраля 2020

Прежде всего, сделайте себе одолжение и измените имя вашей переменной с число на символ , так как именно это вы теперь и сделали совет других.


С помощью Майкла вы уже исправили несколько вещей в своем коде. Проблемы по-прежнему возникают в следующей части кода:

add character,1 ;moved to outer loop
jnz nextline

Как написано, внешний l oop остановится, когда увеличится размер байта . от значения 255 до 0.

Вам необходимо ограничить повышение символа ; до максимального значения '9'.
Для этого можно использовать инструкцию cmp:

add character, 1
cmp character, '9'
jbe nextline

Инструкция jbe будет продолжать возвращаться назад (зацикливаться) до тех пор, пока символ ниже или равен '9'.
Также избегается использование уродливых конструкций, таких как:

‘:' is ASCII for 10

Больше нет необходимости в счетчик в BL и сохранение DX вокруг новой строки являются избыточными.
Это ваш исправленный код:

.MODEL MEDIUM
.STACK
.DATA
character DB '0'
.CODE
.STARTUP
 mov ah, 02h         ; print ASCII char in dl
nextline:
 mov dl, '0'
nextchar:
 int 21h
 inc dl
 cmp dl, character
 jbe nextchar

 mov dl, 13          ; carriage return
 int 21h
 mov dl, 10          ; line feed
 int 21h
 add character, 1
 cmp character, '9'
 jbe nextline
.EXIT
END

Обратите внимание, что символ теперь начинается с '0 '(а не' 1 ').

...