Лидеры рейтинга

ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

1058

Россия, пос. Теплоозёрск, ЕАО


ID: 226425

Konstantin Shvetski

Модератор

314

Россия, Северодвинск


ID: 401284

Михаил Александров

Советник

278

Россия, Санкт-Петербург


ID: 137394

Megaloman

Мастер-Эксперт

177

Беларусь, Гомель


ID: 400669

epimkin

Профессионал

105


ID: 404002

sglisitsyn

6-й класс

42


ID: 242862

Hunter7007

Мастер-Эксперт

31

Россия, Омск


8.10.3

30.10.2021

JS: 2.10.3
CSS: 4.6.0
jQuery: 3.6.0
DataForLocalStorage: 2021-12-04 22:46:17-standard


Создание программ на языке Assembler.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 201533

Раздел:  Assembler
Автор вопроса: Iriska13 (Посетитель)
Дата: 22.10.2021, 10:03 Консультация закрыта
Поступило ответов: 1

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Каким образом можно преобразовать строку в число на TASM? За день перепробовал кучу функций из интернета, ни одна не работает корректно.

Доброе время суток!

В приложении, код Tasm:
Код [Assembler]
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

Контролируется ввод, попробуйте ввести, что-то вроде 12-23 или --1234.
Удачи!

Зенченко Константин Николаевич

Старший модератор
26.10.2021, 12:20
Мини-форум консультации # 201533

q_id

Зенченко Константин Николаевич

Старший модератор

ID: 31795

1

= общий =    22.10.2021, 11:53
Iriska13:

Показывайте Ваши попытки.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

q_id

Iriska13

Посетитель

ID: 405426

2

= общий =    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

q_id

Зенченко Константин Николаевич

Старший модератор

ID: 31795

3

= общий =    22.10.2021, 19:14
Iriska13:

Вы вводите строку, потом ее переводите в число.
smile
Зачем?

Код [Assembler]
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

Обработку минуса не добовлял, но попробуйте ввести что-то, кроме числа.
smile

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

q_id

Iriska13

Посетитель

ID: 405426

4

= общий =    22.10.2021, 21:43

А есть способ ввести сразу число? Мне нужно с клавиатуры считать число, которое потом будет использоваться для сравнения

q_id

Зенченко Константин Николаевич

Старший модератор

ID: 31795

5

= общий =    23.10.2021, 12:56
Iriska13:

А есть способ ввести сразу число


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

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

q_id

Iriska13

Посетитель

ID: 405426

6

= общий =    24.10.2021, 20:34

А из какого регистра она берет символы и в какой записывает? Записывает я так понимаю в al, а берет откуда?

q_id

Зенченко Константин Николаевич

Старший модератор

ID: 31795

7

= общий =    25.10.2021, 11:04
Iriska13:

Когда с клавиатурой, что-то происходит контролер клавиатуры выставляет запрос прерывания и заполняет регистр дданных. Процессор обнаружив запрос - запускает обработчик прерывания 09, который читает из регистра данных конторолера код нажатой/отпущенной клавиши. Взависимости, от режима этот код преобразуется в символ верхнего/нижнего регистра, русский/английский и т.д. после этого сбрасывается контролеры. Обработчик срабатывает 2-а раза, когда клавиша нажимается и отпускается.

Вам это действительно нужно?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 244

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 197

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 43

Nastya

1-й класс

Рейтинг: 3

Evgen aka Chuma

6-й класс

Рейтинг: 0

cain52

3-й класс

Рейтинг: 0