Irvine's ReadInt
преобразует введенное число во внутренний формат ЦП "DWORD".Чтобы записать его как ASCII (WriteString
), его необходимо преобразовать.Поскольку в опубликованной программе зарезервирован только один байт для каждого числа и хранится только AL
, я предполагаю, что необходимо преобразовать только диапазон 0,9.Следовательно, только одно число должно быть преобразовано в один символ ASCII.Таблица конвертации выглядит следующим образом:
CPU -> ASCII
0 -> 48
1 -> 49
2 -> 50
3 -> 51
4 -> 52
5 -> 53
6 -> 54
7 -> 55
8 -> 56
9 -> 57
Tl; др: Просто добавьте 48 к AL
:
;.686 ; Included in Irvine32.inc
;.MODEL FLAT, STDCALL ; Included in Irvine32.inc
;.STACK ; Not needed for .MODEL FLAT
INCLUDE Irvine32.inc
.DATA
txt1 byte "ENTER NUM OF ROWS:",0dh,0ah,0
txt2 byte "ENTER NUM OF COLUMNS:",0dh,0ah,0
txt3 byte "ENTER AN ARRAY OF "
rown byte 0,"x" ;rows number
coln byte 0,":",0dh,0ah,0 ;columns number
.CODE
main PROC
mov edx,offset txt1
call WriteString ;asks the user to enter the rows number
call ReadInt
add al, 48
mov rown, al
mov edx, offset txt2
call WriteString
call ReadInt ;asks the user to enter the columns number
add al, 48
mov coln, al
mov edx, offset txt3
call WriteString
call WaitMsg
exit
main ENDP
END main
Некоторые предостережения:
1) Ирвин ReadInt
«читает 32-разрядное целое число со знаком».Таким образом, число в EAX
может быть вне диапазона 0,9, а в AL
- что-то еще, кроме действительного числа.Чтобы преобразовать все значение в EAX
, посмотрите `здесь .
2) В rown
и coln
теперь ASCII-символы.В конечном итоге они должны быть преобразованы в целое число перед дальнейшей обработкой.
3) Преобразование DWORD, которое привело бы к двум десятичным цифрам или более, немного сложнее. Отдельные цифры должны быть изолированы путем многократного деленияна 10 и сохраните остаток.