Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
5 / 5 / 0
Регистрация: 22.11.2011
Сообщений: 86
1

Вывод на экран длины введенной с клавиатуры строки

23.11.2011, 10:18. Просмотров 7232. Ответов 11
Метки нет (Все метки)


Граждане! Выручайте!
Нужно разработать программу перевода ввода и вывода чисел в различных системах счисления, а также работы с числами в ассемблерных программах. Вывести на экран длину введенной с клавиатуры строки, систему счисления результата выбирает пользователь (двоичная, восьмеричная, десятичная, шестнадцатеричная).
Программу перевода в 16-ричную систему я собрал. А вот как в ней сделать вывод на экран длину строки не соображу. Помогайте.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
stk segment stack
  db 256 dup(?)
stk ends
 
data segment 
  tab db '0123456789ABCDEF'
  buf db 6,00,6 dup(?)
  mes db 10,13,'$'
  msg db 'Input here:$'
data ends
 
code segment 
  assume cs:code,ss:stk,ds:data
  ; процедура перевода в 16-ую систему счисления
  proc16 proc
    mov bl,dh
    mov cl,4
    shr bl,cl
    and bl,00001111b
    xor bh,bh
    mov dl,tab[bx]
    mov ah,2h
    int 21h
    mov bl,dh
    and bl,00001111b
    xor bh,bh
    mov dl,tab[bx]
    mov ah,2h
    int 21h
    ret
  proc16 endp
  
start:
  mov bx,data
  mov ds,bx
  mov ah,9h
  mov dx,offset msg
  int 21h
  mov ah,0ah
  mov dx,offset buf
  int 21h
  mov ah,9h
  mov dx,offset mes
  int 21h       
 
; преобразование введенной строки символов в число
  mov di,0
  lea bx,buf+1  ;в bx адрес второго элемента буфера
  mov cx,[bx]       ;в cx количество введенных символов
  xor ch,ch
  mov si,1      ;в si множитель 
met:    
  push si       ;сохраняем si (множитель) в стеке
  mov si,cx     ;в si помещаем номер текущего символа 
  mov ax,[bx+si]    ;в ax помещаем текущий символ     
  xor ah,ah
  pop si        ;извлекаем множитель (si)из стека
  sub ax,30h        ;получаем из символа (ax) цифру
  mul si        ;умножаем цифру (ax)на множитель (si)
  add di,ax     ;складываем с результирующим числом
  mov ax,si     ;помещаем множитель (si) в ax
  mov dx,10 
  mul dx        ;увеличиваем множитель (ax) в 10 раз
  mov si,ax     ;перемещаем множитель (ax) назад в si
loop met        ;переходим к предыдущему символу
 
; перевод в 16-ую систему счисления
  mov dx,di
  call proc16
  mov dx,di
  xchg dh,dl
  call proc16
  mov ah,2h
  mov dl,'h'
  int 21h
  mov ah,9h
  mov dx,offset mes 
  int 21h       
code ends
end start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.11.2011, 10:18
Ответы с готовыми решениями:

С клавиатуры вводится цифра, необходимо вывести на экран все цифры, начиная с ‘2’ и заканчивая введенной с клавиатуры.
С клавиатуры вводится цифра, необходимо вывести на экран все цифры, начиная с ‘2’ и заканчивая...

Составить программу для ввода строки символов с клавиатуры в буфер и вывод этой строки на экран
Составить программу для ввода строки символов с клавиатуры в буфер и вывод этой строки на экран ...

Ввод с клавиатуры и вывод на экран символа и строки
1. Напишите программу на языке ассемблера, которая: - вводит с клавиатуры произвольный символ; -...

Сравнение строки, введенной с клавиатуры, с заданной
Помогите пожалуйста сравнить строку, введенную с клавиатуры, с той, которая по умолчанию data...

__________________
Помогаю в написании студенческих работ здесь.
11
Ушел с форума
Автор FAQ
14176 / 7060 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
23.11.2011, 10:36 2
fantompg,
1) используй с кодом тэги [АSM] и [/АSM]
2) при вводе строки при помощи функции 0Ah прерывания 21h с указанием адреса строки
первый символ строки содержит сколько символов можно ввести, а во втором символе строки после нажатия на Enter будет содержаться число введенных символов, вот отсюда и возьмешь длину строки -- в твоем примере buf db 6,?,6 dup(?)
buf db 6, <-- максимальное количество символов, которое можно ввести
?, <-- реальное число введенных символов -- это подставит система
db 6 dup (?) ;сама строка для ввода
1
5 / 5 / 0
Регистрация: 22.11.2011
Сообщений: 86
29.11.2011, 21:08  [ТС] 3
Что то ничего у меня не получается...

Добавлено через 19 часов 5 минут
О добрые люди! Подскажите!

Добавлено через 11 часов 51 минуту
Ну пожалуйста!
0
Клюг
7668 / 3183 / 382
Регистрация: 03.05.2011
Сообщений: 8,381
29.11.2011, 22:01 4
Assembler
1
2
3
4
5
6
7
8
9
10
11
; read string
    mov ah, 0Ah
    mov dx, inpbuf
    int 21h
; prepare for convert
    mov si, dx
    lodsw
    mov di, si
    movzx   ax, ah
    mov cx, ax
; cx - str length, DS:SI = ES:DI -> string buf
1
Ушел с форума
Автор FAQ
14176 / 7060 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
30.11.2011, 03:55 5
Charles Kludge, команда movzx ax,ah теоретически возможна, но практически равноценна mov ah,0 только к чему такой изврат? Наверное имелась ввиду команда movzx ax,al?
1
5 / 5 / 0
Регистрация: 22.11.2011
Сообщений: 86
30.11.2011, 08:18  [ТС] 6
Не хочет.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
stk segment stack
  db 256 dup(?)
stk ends
 
data segment 
  tab db '0123456789ABCDEF'
  buf db 6,00,6 dup(?)
  mes db 10,13,'$'
  msg db 'Input here:$'
data ends
 
code segment 
  assume cs:code,ss:stk,ds:data
  ; процедура перевода в 16-ую систему счисления
  proc16 proc
    mov bl,dh
    mov cl,4
    shr bl,cl
    and bl,00001111b
    xor bh,bh
    mov dl,tab[bx]
    mov ah,2h
    int 21h
    mov bl,dh
    and bl,00001111b
    xor bh,bh
    mov dl,tab[bx]
    mov ah,2h
    int 21h
    ret
  proc16 endp
  
start:
  mov bx,data
  mov ds,bx
  mov ah,9h
  mov dx,offset msg
  int 21h
  mov ah,0ah
  mov dx,offset buf
  int 21h
  mov ah,9h
  mov dx,offset mes
  int 21h        
 
; преобразование введенной строки символов в число
  mov di,0
  lea bx,buf+1    ;в bx адрес второго элемента буфера
  mov cx,[bx]        ;в cx количество введенных символов
  xor ch,ch
  mov si,1        ;в si множитель 
met:    
  push si        ;сохраняем si (множитель) в стеке
  mov si,cx        ;в si помещаем номер текущего символа 
  mov ax,[bx+si]    ;в ax помещаем текущий символ     
  xor ah,ah
  pop si        ;извлекаем множитель (si)из стека
  sub ax,30h        ;получаем из символа (ax) цифру
  mul si        ;умножаем цифру (ax)на множитель (si)
  add di,ax        ;складываем с результирующим числом
  mov ax,si        ;помещаем множитель (si) в ax
  mov dx,10    
  mul dx        ;увеличиваем множитель (ax) в 10 раз
  mov si,ax        ;перемещаем множитель (ax) назад в si
loop met        ;переходим к предыдущему символу
 
; перевод в 16-ую систему счисления
  mov dx,di
  call proc16
  mov dx,di
  xchg dh,dl
  call proc16
  mov ah,2h
  mov dl,'h'
  int 21h
  mov ah,9h
  mov dx,offset mes    
  int 21h
; read string
        mov     ah, 0Ah
        mov     dx, inpbuf
        int     21h
; prepare for convert
        mov     si, dx
        lodsw
        mov     di, si
        movzx   ax, al
        mov     cx, ax
; cx - str length, DS:SI = ES:DI -> string bu        
code ends
end start

Ошибка:
0
Миниатюры
Вывод на экран длины введенной с клавиатуры строки  
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,046
30.11.2011, 08:35 7
fantompg,
Assembler
1
2
3
mov al, buf+1
or al,30h
int 29h
И выведет тебе длину строки.
1
5 / 5 / 0
Регистрация: 22.11.2011
Сообщений: 86
30.11.2011, 09:00  [ТС] 8
Спасибо огромное!!!
Все работает, как часы!
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,046
30.11.2011, 09:07 9
Не за что. fantompg, только помни,что если длина строки будет больше 9 символов, такой номер не проканает.
0
Ушел с форума
Автор FAQ
14176 / 7060 / 831
Регистрация: 11.11.2010
Сообщений: 12,669
30.11.2011, 09:09 10
fantompg, а вот так можно выводить число от 0 до 99
Assembler
1
2
3
4
5
6
7
8
9
    mov al, buf+1
    aam
    or ax,'00'
    cmp ah,'0'
    je l1
    xchg ah,al
    int 29h
    mov al,ah
l1: int 29h
1
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,046
30.11.2011, 09:15 11
А вот так от 0 до 255
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
xor bl,bl
mov al,n
cmp al,100 
jc @f
aam
mov bl,al
or bl,30h
mov al,ah
@@:
aam
test ah,ah
jz @f
xchg al,ah
or al,30h
int 29h
mov al,ah
@@:
or al,30h
int 29h
mov al,bl
int 29h
1
5 / 5 / 0
Регистрация: 22.11.2011
Сообщений: 86
30.11.2011, 09:25  [ТС] 12
Цитата Сообщение от Mikl___ Посмотреть сообщение
fantompg, а вот так можно выводить число от 0 до 99
Assembler
1
2
3
4
5
6
7
8
9
    mov al, buf+1
    aam
    or ax,'00'
    cmp ah,'0'
    je l1
    xchg ah,al
    int 29h
    mov al,ah
l1: int 29h
Да, и так тоже работает!
Только почему то приходиться несколько раз запускать .exe файл, что бы начал считать.
Спасибо Вам всем огромное.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2011, 09:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Рассортировать в разные файлы символы введенной с клавиатуры строки
Рассортировать в разные файлы введенную с клавиатуры строку. Вывести в отдельные файлы: 1 Большие...

Разработать программу преобразования введенной с клавиатуры строки к верхнему регистру
Архитектура процессора 8086. Сегменты, принцип сегментации памяти. Разработать программу...

Выделить из строки, введенной с клавиатуры, десятичные числа, заключенные между символами |
Выделить из строки, введенной с клавиатуры, десятичные числа, заключенные между символами |. Найти...

Вывод на принтер введенной строки
Стоит задача: составить в emu8086 программу, выводящая введенную пользователем строку на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.