Получение символов вместо int - PullRequest
0 голосов
/ 30 октября 2011

Я получаю символы вместо int, когда я прошу пользователя ввести rown & coln с readint и writestring впоследствии.Как я могу получить введенный int для показа?

.686
.MODEL FLAT, STDCALL
.STACK
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
mov rown,al
mov edx,offset txt2
call writestring
call readint                                ;asks the user to enter the columns number
mov coln,al

mov edx, offset txt3
call writestring  ;;;;; here is the problem !!!!!
call waitmsg
       exit
main ENDP
END main

Ответы [ 2 ]

3 голосов
/ 30 октября 2011

Я просто догадываюсь, поскольку важная часть кода отсутствует.
Поскольку readInt читает и возвращает число, вам, вероятно, следует преобразовать его в строку перед записью.
Просто чтобы бытьконечно, попробуйте ввести 97 (десятичное число) в качестве количества столбцов и строк.Если я не ошибаюсь, выводится сообщение "ENTER AN ARRAY OF axa:"

0 голосов
/ 02 января 2016

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 и сохраните остаток.

...