Консультация № 201533
22.10.2021, 10:03
0.00 руб.
0 8 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Каким образом можно преобразовать строку в число на TASM? За день перепробовал кучу функций из интернета, ни одна не работает корректно.

Обсуждение

давно
Старший Модератор
31795
6196
22.10.2021, 11:53
общий
Адресаты:
Показывайте Ваши попытки.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
405426
3
22.10.2021, 17:48
общий
Самая простая функция:
StrToNumber PROC
mov bh, [si + 2]
mov bl, [si + 3]
sub bx, 3030h
mov al, 10
mul bh
add al, bl
ret
ENDP


Вторая функция, она вроде как работает, но если начать использовать число это, то программа не работает

StrToInt proc
push ax
push bx
push cx
push dx
push ds
push es
push si

push ds
pop es

mov cl, ds:[si]
xor ch, ch

inc si

mov bx, 10
xor ax, ax


cmp byte ptr [si], '-'
jne @@Loop
inc si
dec cx
@@Loop:
mul bx
mov [di], ax
cmp dx, 0
jnz @@Error

mov al, [si]
cmp al, '0'
jb @@Error
cmp al, '9'
ja @@Error
sub al, '0'
xor ah, ah
add ax, [di]
jc @@Error
cmp ax, 8000h
ja @@Error
inc si

loop @@Loop

pop si
push si
inc si
cmp byte ptr [si], '-'
jne @@Check
neg ax
jmp @@StoreRes
@@Check:
or ax, ax ;
js @@Error
@@StoreRes:
mov [di], ax
clc
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
ret
@@Error:
xor ax, ax
mov [di], ax
stc
pop si
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
ret
StrToInt endp
давно
Старший Модератор
31795
6196
22.10.2021, 19:14
общий
Адресаты:
Вы вводите строку, потом ее переводите в число.

Зачем?
[code lang=asm]inputNum proc
xor si,si
mov bx,10
@@01: xor ax,ax
int 16h
cmp al,13
jmp @@02
cmp al,'0'
jb @@01
cmp al,'9'
ja @@01
push ax
int 29h
pop ax
and ax.0Fh
xchg ax,si
xor dx,dx
mul bx
add si,ax
jmp @@01
@@02: mov ax,si
ret
inputNum endp[/code]
Обработку минуса не добовлял, но попробуйте ввести что-то, кроме числа.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
405426
3
22.10.2021, 21:43
общий
А есть способ ввести сразу число? Мне нужно с клавиатуры считать число, которое потом будет использоваться для сравнения
давно
Старший Модератор
31795
6196
23.10.2021, 12:56
общий
Адресаты:
Цитата: Iriska13
А есть способ ввести сразу число

С клавиатуры читаются символы.
Фунция, которую я Вам дал получает символы цифр и сразу переводит в число.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
405426
3
24.10.2021, 20:34
общий
А из какого регистра она берет символы и в какой записывает? Записывает я так понимаю в al, а берет откуда?
давно
Старший Модератор
31795
6196
25.10.2021, 11:04
общий
Адресаты:
Когда с клавиатурой, что-то происходит контролер клавиатуры выставляет запрос прерывания и заполняет регистр дданных. Процессор обнаружив запрос - запускает обработчик прерывания 09, который читает из регистра данных конторолера код нажатой/отпущенной клавиши. Взависимости, от режима этот код преобразуется в символ верхнего/нижнего регистра, русский/английский и т.д. после этого сбрасывается контролеры. Обработчик срабатывает 2-а раза, когда клавиша нажимается и отпускается.

Вам это действительно нужно?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
26.10.2021, 12:20
общий
это ответ
Доброе время суток!

В приложении, код Tasm:
[code lang=asm]model tiny,pascal
locals @@
.code
org 100h
begin: call inputNum,offset dbInput
or ax,ax
jz @@01
call outputNum,ax,2,offset dboutput
call outputNum,ax,8,offset dboutput
call outputNum,ax,10,offset dboutput
call outputNum,ax,16,offset dboutput
jmp begin
@@01: ret
outputNum proc,a:word,b:word,c:word
uses ax,bx,cx,dx
mov ah,9
mov dx,c
int 21h
mov ax,b
aam
or ax,'00'
push ax
xchg ah,al
int 29h
pop ax
int 29h
mov al,')'
int 29h
mov ax,a
mov bx,b
xor cx,cx
@@02: xor dx,dx
div bx
push dx
inc cx
or ax,ax
jnz @@02
@@03: pop ax
cmp al,10
jb @@04
add al,7
@@04: add al,'0'
int 29h
loop @@03
ret
outputNum endp
dbInput db 10,13,'number>$'
dbOutput db 10,13,'system($'
inputNum proc,a:word
uses bx,cx,dx,si
mov ah,9
mov dx,a
int 21h
xor si,si
xor di,di
mov bx,10
@@01: xor ax,ax
int 16h
cmp al,13
jz @@03
cmp al,'-'
jnz @@02
or si,si
jnz @@01
or di,di
jnz @@01
int 29h
mov di,-1
jmp @@01
@@02: cmp al,'0'
jb @@01
cmp al,'9'
ja @@01
push ax
int 29h
pop ax
and ax,0Fh
xchg ax,si
xor dx,dx
mul bx
add si,ax
jmp @@01
@@03: mov ax,si
or di,di
jz @@04
neg ax
@@04: ret
inputNum endp
end begin[/code]
Контролируется ввод, попробуйте ввести, что-то вроде 12-23 или --1234.
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа