Вывод по координатам

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Alyonka_v
Сообщения: 4
Зарегистрирован: 13 сен 2009, 12:59

Здравствуйте! Я только начала изучать ассемблер, использую компилятор Tasm. Пыталась написать программу, которая запрашивает координаты х и у и выводит * в этих координатах. (Х должно быть [00..79], a Y [00..24]. Подскажите, пожалуйста, что нужно исправить, чтобы программа работала корректно.
Зарание благодарна.
P.S. Вообще в задании написано, что нужно запрашивать строку Xstr и Ystr используя прерывание 21h и функцию 0ah, а потом уже строки преобразовывать в числа, но как это сделать я вообще не поняла, поэтому попробывала запрашивать посимвольно.

Код: Выделить всё

.MODEL small
.STACK 200h
.DATA
p1 db 'Pervaja cifra(desjatok) Xstr dolzhna bytj [0..7], cifra ne prinimaetja programmoj, poka ne popadjot v nuzhnyj diapazon', '$'
p2 db 'Pervaja cifra(desjatok) Ystr dolzhna bytj [0..2], cifra ne prinimaetja programmoj, poka ne popadjot v nuzhnyj diapazon', '$'
p3 db 'Vtoraja cifra(edenichnyj razrjad) Ystr dolzhen bytj [0..4], cifra ne prinimaetja programmoj, poka ne popadjot v nuzhnyj diapazon', '$'  
pustaja db 0dh, 0ah, '$' 
Zvezda db '*', '$'
.CODE
ProgramStart: mov ax, @data
              mov ds, ax
              xor di, di
              xor si, si
              mov ah, 9
              mov dx, offset p1
              int 21h
              mov ah, 9
              mov dx, offset pustaja
              int 21h              
  xstr1:      mov ah, 08h  ; запрос первой цифры числа х и преобразование в числовую форму
              int 21h
              cmp al, '0'
              jb xstr1
              cmp al, '7'
              ja xstr1
              mov ah, 02h
              mov dl, al
              int 21h
              sub al, '0'
              xor ah, ah
              mov bx, 10
              mul bx
              mov di, ax
              jmp xstr2
  xstr2:      mov ah, 08h  ; запрос второй цифры числа х и преобразование в числовую форму
              int 21h
              cmp al, '0'
              jb xstr2
              cmp al, '9'
              ja xstr2
              mov ah, 02h
              mov dl, al
              int 21h
              sub al, '0'
              xor ah, ah
              mov cx, ax 
              mov ax, di
              add ax, cx
              mov di, ax
              mov ah, 9
              mov dx, offset pustaja
              int 21h
              mov ah, 9
              mov dx, offset p2
              int 21h
              mov ah, 9
              mov dx, offset pustaja
              int 21h
              mov ah, 9
              mov dx, offset p3
              int 21h
              mov ah, 9
              mov dx, offset pustaja
              int 21h
              jmp ystr1
  ystr1:      mov ah, 08h  ; запрос первой цифры числа у и преобразование в числовую форму
              int 21h
              cmp al, '0'
              jb ystr1
              cmp al, '2'
              ja ystr1
              mov ah, 02h
              mov dl, al
              int 21h
              sub al, '0'
              xor ah, ah
              mov bx, 10
              mul bx
              mov si, ax
              jmp ystr2
  Ystr2:      mov ah, 08h  ; запрос второй цифры числа у и преобразование в числовую форму
              int 21h
              cmp al, '0'
              jb xstr2
              cmp al, '4'
              ja xstr2
              mov ah, 02h
              mov dl, al
              int 21h
              sub al, '0'
              xor ah, ah
              mov cx, ax 
              mov ax, si
              add ax, cx
              mov si, ax
              xor dh, dh
              xor dl, dl
              jmp clrscr
  clrscr:     mov ah, 0fh  ; очистка экрана                  
              int 10h                  
              mov ah, 00h                   
              int 10h
              mov ah, 02h
              mov dh, [si] ; y в dh
              mov dl, [di] ; x в dl
              xor bh, bh                  
              int 10h
              mov ah, 09h
              mov dx, offset Zvezda
              int 21h                    
              xor ah, ah                   
              int 16h
              mov ah, 4Ch                  
              int 21h
END ProgramStart
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Вижу, что после ввода X помещается в регистр DI, а Y - в регистр SI.
Потом же, когда выполняется позиционирование курсора в (X, Y), то берутся не значения этих регистров, а значения ячеек памяти с адресами, равными значениями этих регистров. Т.е. надо писать без квадратных скобок:

Код: Выделить всё

mov ah, 02h
mov dh, si ; y в dh
mov dl, di ; x в dl
xor bh, bh                  
int 10h
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):mov dh, si ; y в dh
mov dl, di ; x в dl
Так нельзя.

Код: Выделить всё

mov ah, 02h
shl si, 8
mov dx, si
or dx, di
xor bh, bh                  
int 10h
Функция 0A принимает указатель на строку, в которой первый байт содержит максимальное кол-во символов в строке, второй байт после вызова будет содержать фактический размер, последущие - сама строка, которая закончится символом 0Dh.

Код: Выделить всё

in_Array db 2, 0, 'XX', 0Dh
...
mov ah, 0Ah
mov dx, offset in_array
int 21h
mov si, offset in_array
cmp byte ptr [si+1], 0
jz @exit
cmp byte ptr [si+1], 1
jz @only_one_char_input
mov bx, [si+2]
sub bx, 3030h
mov al, 10
mul bl
add al, bh
sub ah, ah
jmp @next
     @only_one_char_input:
mov al, [si+2]
sub al, 30h
xor ah, ah
     @next:
В этом примере считывается строка и результат заносится в AX
It's a long way to the top if you wanna rock'n'roll
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

somewhere писал(а):Так нельзя.
Сообщение от BBB
mov dh, si ; y в dh
mov dl, di ; x в dl

Код: Выделить всё

shl si, 8
mov dx, si
or dx, di
xor bh, bh                  
int 10h
Семен Семеныч! :)
Ну конечно же, несоответсвие операндов по размеру. Недоглядел. Давно в ассемблер руки совал :)
Ну, или без сдвигов, а через один из регистров Ax, Bx, Cx:

Код: Выделить всё

mov Bx, si
mov dh, Bl ; y в dh
mov Bx, di ;
mov dl, bl ; x в dl
xor bh, bh                  
int 10h
Alyonka_v
Сообщения: 4
Зарегистрирован: 13 сен 2009, 12:59

Большое спасибо за помощь
Ответить