Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TASM. Где хранятся данные? 
V
    Опции темы
Sanek123
Дата 25.5.2009, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Ребята, вот код:
Код

.model large
.stack 128h
.data
    newstr  db 13,10,'$'
    mess_x  db "enter x = ",'$'
    mess_y  db "enter y = ",'$'
    mess_z  db "enter z = ",'$'
    mess_r  db "rezult: = ",'$'
    x       dw 0
    y       dw 0
    z       dw 0
.code
 start:
    mov ax, @data
    mov ds, ax
    jnz mess
    int 21h

 nillx:
    mov x, 0h

 mess:
    inc x
    cmp x,02h
    jb  messx
    cmp x, 03h
    jb  messy
    cmp x, 04h
    jb  messz    
    cmp x, 05h
    jb  messr
    cmp x,05h
    je  exit

 messx: 
    mov ah,09h
    mov dx,offset mess_x
    int 21h
    jnz @enter

 messy:
    mov ah,09h
    mov dx,offset newstr
    int 21h
    mov dx,offset mess_y
    int 21h
    jnz @enter

 messz:
    mov ah,09h
    mov dx,offset newstr
    int 21h 
    mov dx,offset mess_z
    int 21h
    jnz @enter

 messr: 
    mov ah,09h
    mov dx,offset newstr
    int 21h
    mov dx,offset mess_r
    int 21h
    jnz exit

 @enter:
    mov ah, 08h 
    int 21h
    cmp al, 0dh    
    je  mess
    cmp al, '0'
    jb  @enter
    cmp al, '9'
    ja  @enter
    mov ah,02h  
    mov dl, al
    int 21h
    jnz @enter

 exit:
    mov    ax, 4c00h    
    int    21h

end start

Подскажите как теперь присвоить введнные числа пременным, например x,y,z и вывести результат, скажем сложения всех трех на экран? Точнее я не понимаю где все эти значения храняться в каких регистрах?
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Mikl_
Дата 25.5.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: нет
Всего: 14



Sanek123, введеные данные для начала придется перевести из набора строк в число. Затем провести с этим числом какие-то операции, затем результат снова перевести из числа в строку и вывести эту строку на экран или в файл. У микропроцессора 8 регистров общего назначения -- поэтому данные как правило хранят в оперативной памяти
PM MAIL   Вверх
Sanek123
Дата 25.5.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Цитата

...придется перевести из набора строк в число...

54268742841265 - а разве это не одна строка? Это набор строк?

Так откуда все-таки их извлекать и куда записывать? Если они в памяти, то как к ней обратиться?

--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Akina
Дата 25.5.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Цитата(Sanek123 @  25.5.2009,  16:49 Найти цитируемый пост)
54268742841265 - а разве это не одна строка? Это набор строк?

Это для тебя одна строка. Но обрабатывать ты её будешь по одному байту, каждый из которых есть однобайтовая строка.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
turbanoff
Дата 25.5.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.4.2009

Репутация: нет
Всего: 1



Цитата(Akina @ 25.5.2009,  16:20)
Цитата(Sanek123 @  25.5.2009,  16:49 Найти цитируемый пост)
54268742841265 - а разве это не одна строка? Это набор строк?

Это для тебя одна строка. Но обрабатывать ты её будешь по одному байту, каждый из которых есть однобайтовая строка.

не запутывай ты его... это одна строка.
теперь на по ней пробежаться посимвольно и перевести её в число, я думаю ета тема уже поднималась, если нет загугли
PM MAIL   Вверх
Akina
Дата 25.5.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Цитата(turbanoff @  25.5.2009,  19:15 Найти цитируемый пост)
теперь на по ней пробежаться посимвольно и перевести её в число

О чём я собсно и говорю.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
turbanoff
Дата 25.5.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.4.2009

Репутация: нет
Всего: 1



Цитата

однобайтовая строка.


не самое лучшее объяснения для новичка  smile 
PM MAIL   Вверх
Sanek123
Дата 25.5.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Поправил немного
Код


          .DATA
          .
          .
          .
          .CODE
          .
          .
          .

 @enter:
          mov   ah,1    ;ввод цифры         
          int   21h              
                                 
          mov   [bx],al ;поместить в вх     
          inc   bx         ;перейти к следующему вводу     
                                 
          cmp   al,0dh ;по Enter - выход         
          loopne @enter          


Таким образом я получаю строку в [bx] и уже могу вывести
Код

    mov ah, 09h
    mov dx, [bx]
    int   21h

Собственно вопрос, где храняться переменные - решен. Тепер знаю откуда взять и как вывести. Глупо, конечно...
Ребята, а как все-таки перевести строку в число? Потому как при сложении происходит конкатенация: 23+56=2356...

Это сообщение отредактировал(а) Sanek123 - 25.5.2009, 19:29
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Mikl_
Дата 26.5.2009, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: нет
Всего: 14



Цитата(Sanek123)
Потому как при сложении происходит конкатенация: 23+56=2356...

"...Так эта-ж бубль-гум!" (м/ф "Возвращение блудного попугая")
У тебя есть две строки String_X='2','3' и String_Y='5','6' переводим строку в число
X=(String_X[0]-'0')*10+String_X[1]-'0'=(32h-30h)*0Ah+33h-30h=17h
Y=(String_Y[0]-'0')*10+String_Y[1]-'0'=(35h-30h)*0Ah+36h-30h=38h
X+Y=17h+38h=4Fh
Теперь обратная процедура из числа в строку
4Fh / 0Ah = 7 остаток 9 
String_Result[0]=7+30h=37h='7' первый символ  
String_Result[1]=9+30h=39h='9' второй символ
String_Result='7','9' smile 


Это сообщение отредактировал(а) Mikl_ - 26.5.2009, 03:42
PM MAIL   Вверх
Sanek123
Дата 26.5.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Цитата

X=(String_X[0]-'0')*10+String_X[1]-'0'=(32h-30h)*0Ah+33h-30h=17h
Y=(String_Y[0]-'0')*10+String_Y[1]-'0'=(35h-30h)*0Ah+36h-30h=38h

Можно отот фрагмент поподробнее? Желательно на ассемблере! Алгоритм мне понятен немогу записать по правилам синтаксиса асм-а. smile 
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Mikl_
Дата 27.5.2009, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: нет
Всего: 14



Цитата(Sanek123 )
Можно отот фрагмент поподробнее? Желательно на ассемблере! Алгоритм мне понятен немогу записать по правилам синтаксиса асм-а.
И это после того как ассемблер весь семестр изучали? Ничего тебе не понятно. Ближе к сессии приперло и вот тогда зашевилился smile 
Код
.code
        mov ah,9
        mov dx,offset a0    ;Введите 9-значное число 
        int 21h
        mov ah,0Ah
        mov dx,offset buffer    ; читаем число в buffer
        int 21h
; переводим ASCII-строку в число
        xor eax,eax        ; eax:=0     
        cdq                     ; edx:=0
        mov ebx,offset buffer+2
        movzx ecx,byte ptr [ebx-1]; число символов находящихся в buffer
m:     mov al,[ebx]    ; получаем в AL код очередной цифры
        and al,0Fh              ; выделение очередной цифры из ASCII-кода
        imul edx,10
        add edx,eax
        inc ebx                 ; переходим к следующей цифре
        loop m
        mov temp,edx     ; число в temp    
.data
max = 10                        ;максимальное количество цифр 
a0 db 'Введите 9-значное число',0Ah,'$'
buffer db max,?,max+1 dup(0)
temp dd 0    ; место под число


Это сообщение отредактировал(а) Mikl_ - 27.5.2009, 08:19
PM MAIL   Вверх
Sanek123
Дата 27.5.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Цитата

И это после того как ассемблер весь семестр изучали? Ничего тебе не понятно. Ближе к сессии приперло и вот тогда зашевилился

Не надо так ругаться, ассемблер не изучал. Учу сейчас по книжкам и что непонятно у вас спрашиваю.
Из твоего примера не понял откуда в buffer взялось число (которое ввели с клавы) гдето указано записать ASCII в buffer.
Цитата

mov dx,offset buffer    ; читаем число в buffer

По правилам команды mov значение помещается в первый операнд.
Или я не прав?
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Mikl_
Дата 27.5.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: нет
Всего: 14



Sanek123, читай про функцию 0Ah прерывания 21h
вводит строку длиной до 254 символов, выводя эти символы на экран. Правильно интерпритируются нажатия на Backspace и Delete. Ввод символов продолжается до тех пор, пока не нажата клавиша Enter. Адрес памяти, куда будет помещена строка символов, указан в регистрах DS:DX. Для ввода 50-символьной строки надо отвести 53 байта памяти. Первый байт будет содержать число байтов отведенных для этой строки плюс 1 для символа возврата каретки. Второй байт — число реально введенных символов — это число поместит операционная система DOS как только ты нажмешь на Enter. Последний байт отводится под символ возврата каретки. smile 
Код
mov ah,0Ah    ;номер функции
mov dx,offset BUFFER    ;адрес буфера
int 21h
;в области данных
BUFFER db 51,0    ;дескрипторы буфера
 db 51 DUP(?) ;сам буфер
Цитата
mov dx,offset buffer    ; читаем число в buffer
По правилам команды mov значение помещается в первый операнд.
Или я не прав?
mov dx,offset buffer    в регистр dx помещается адрес переменной по имени buffer
Наверное, не прав, только о чем вопрос? smile 

Это сообщение отредактировал(а) Mikl_ - 27.5.2009, 11:10
PM MAIL   Вверх
Sanek123
Дата 27.5.2009, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Mikl_, премного благодарен за помощь!
Только 0ah не катит, так как ввод скрыт от пользователя 08h, далее распознание символа и если это цифра - отображение 02h и  запись в переменную.
Плюс eax, abx, edx - 32-разрядные: они мне не нужны.
Если не трудно поправьте, пожалуйста, код:
Код

.model large
.stack 128
.data
    newstr  db "              ",13,10,13,'$'
    mess_x  db "enter x = ",'$'
    mess_r  db "rezult: = ",'$'
    x       dw 0
    y       dw 0
    tab db 0
.code

 start:
    mov ax, @data
    mov ds, ax
    mov ah,09h
    mov dx,offset mess_x
    int 21h


;первая цифра
    mov ah, 08h 
    int 21h
    cmp al, 0dh    
    je  @strtoint

    mov [tab], al
    inc tab 
    mov ah, 02h
    mov dl, al
    int 21h

;вторая цифра
    mov ah, 08h 
    int 21h
    cmp al, 0dh    
    je  @strtoint

    mov [tab], al
    inc tab 
    mov ah, 02h
    mov dl, al
    int 21h

;третья цифра
    mov ah, 08h 
    int 21h
    cmp al, 0dh    
    je  @strtoint

    mov [tab], al
    mov ah, 02h
    mov dl, al
    int 21h


 @strtoint:

xor si, si
mov ah,02h
mov dl, tab[si]
add dl, 10
int 21h
inc si


mov ah,02h
mov dl, tab[si]
add dl, 10
int 21h
inc si

mov ah,02h
mov dl, tab[si]
add dl, 10
int 21h

jnz @inttostr

 @inttostr:
    mov ah, 09h
    mov dx, offset newstr
    int 21h

    mov dx, offset mess_r
    int 21h

xor si, si
mov ah,02h
mov dl, tab[si]
add dl, 30h
int 21h
inc si


mov ah,02h
mov dl, tab[si]
add dl, 30h
int 21h
inc si

mov ah,02h
mov dl, tab[si]
add dl, 30h
int 21h

 exit:
    mov    ax, 4c00h    
    int    21h

end start

Я исходник упростил до неузнаваемости что б, как говориться, на пальцах прощупать.  В  @strtoint: надо умножать на 10
Код

mov dl, tab[si]
add dl, 10

но что-то mul не идет.
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Sanek123
Дата 31.5.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Всем спасибо за поддержку!
Разобрался с мулом :
mul - команда умножения. Умножает содержимое опреанда на значение содержащееся в регистре ах!
я же пытался запихнуть второй опреанд mul bx, dx и он мне соответственно выдавал типа Fatal [..] Extra character on line
Вот что бывает от неумения читать книжки, или от невнимательного их чтения!
imul - тоже умножение только со знаком.
A tab изначально объявил как строку db, потому и не шло, надо было dw.
В соседнем топике участник привел пример кода, а на конкретном примере все оказалось понятно, вчастности перебор символов и перевод в число.
Тема закрыта.

Это сообщение отредактировал(а) Sanek123 - 31.5.2009, 09:58
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0610 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.