Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

Восстановить пароль
Повторная активизация e-mail

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

Ответ
 
Опции темы
Старый 16.12.2016, 14:16   #1
K1905
 
Регистрация: 12.02.2010
Адрес: Беларусь
Сообщений: 7
Репутация: 20
По умолчанию Работа со строками в памяти [Tasm]

Помогите найти ошибку при отладке программы TASM
Код:

 
Input string....: 0123456789
Output string...: 56789 01234
===================================
Operation completed !!!


Код:

  use16
  org 100h
  jmp start

  mUser1  db  13,10,' Input string....: $'
  mUser2  db  13,10,' Output string...: $'
  mUser3  db  13,10,' ==================================='
          db  13,10,' Operation completed !!! $'

  start:
     mov  dx,mUser1      ; приглашение на ввод
     call message        

     cld                 ; флаг направления для 'lodsb' (обсудим позже)
     push di             ; сохраним указатель на начало строки

     mov  cx,10          ; длинна строки (цикл)
  istr:
     call presskey       ; ждём символ с клавиатуры
     int  29h            ; печатаем его
     stosb               ; сохраняем символ в 'DI'
     loop istr           ; мотаем цикл 10 раз. Строка считана. ES:DI = 0B35:0009

     mov  dx,mUser2      ; мессага юзеру с результатом
     call message        

     pop  si             ; теперь SI указывает на строку 
     add  si,5           ; переместим указатель на вторую половину строки

     mov  cx,5           ; выводим 5 символов
  ostr:
     lodsb               ; читаем символ..
     int  29h            ; печатаем его
     loop ostr           ; мотаем цикл, пока CX не обнулится

     mov  al,' '         ; вставим пробел..
     int  29h

     mov  si,-2          ; переместим указатель на начало строки
     mov  cx,5           ; выводим первые(5) символов
  ostr:
     lodsb               ; читаем символ..
     int  29h            ; печатаем его
     loop ostr           ; мотаем цикл, пока CX не обнулится

     mov  dx,mUser3      ; выводим юзеру "Operation completed"
     call message

     call presskey       ; ждём клавишу, чтоб осмотреться
     int  20h            ; выходим из программы

  ;------- знакомые лица! ------------------------------------|
  message:
     mov  ah,9
     int  21h
  ret
  presskey:
     xor  ax,ax
     int  16h
  ret

Не получается вывод пяти первых символов в завершении программы
при отладке и вывода сообщения "Operation completed" на экране консоли получается такой вывод.
Код:

 Input string....: 0123456789
 Output string...: 56789   012   012

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 16.12.2016 в 14:21.
K1905 вне форума   Ответить с цитированием
Старый 16.12.2016, 14:26   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 820
Репутация: 597
По умолчанию

K1905, это глючный код.
Нужен буфер в секции данных и натравить на него DI.
При выводе первой половины, просто выставить SI на начало буфера
__________________
Нашедшего выход - затаптывают первым..
R71MT вне форума   Ответить с цитированием
Старый 16.12.2016, 23:15   #3
K1905
 
Регистрация: 12.02.2010
Адрес: Беларусь
Сообщений: 7
Репутация: 20
По умолчанию

Но данный код является правильным *.com-файлом и при открытии его через
cmd.exe редактором получаем правильный ответ показанный ниже
C:\>edit 3.com
ыn
Input string....: $0123456789
Output string...: $56789 01234
===================================
Operation completed !!! $║☻☺ш9 №W╣
ш6 ═)кт°║↑☺ш& ^Г╞♣╣♣ м═)т√░ ═)╛■*╣♣ м═)ть║.☺ш♣ ш• ═ ┤ ═!├1└═▬├
K1905 вне форума   Ответить с цитированием
Старый 17.12.2016, 07:38   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 820
Репутация: 597
По умолчанию

А чем Вы его собираете, Тасмом? Это-же фасмовский код..
__________________
Нашедшего выход - затаптывают первым..
R71MT вне форума   Ответить с цитированием
Старый 17.12.2016, 18:28   #5
K1905
 
Регистрация: 12.02.2010
Адрес: Беларусь
Сообщений: 7
Репутация: 20
По умолчанию Работа со строками в памяти [Tasm]

Файл *com в отладчике TASM я пропускаю через файл td.exe и он проводит всю таксировку команд команд программы,показывает действия регистров и флагов, можно также работать с файлом *exe.
K1905 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler, tasm цепочечные команды для работы с строками D9bolic Помощь студентам 2 12.05.2012 13:24
TASM работа с файлами Dimon12345 Assembler 4 12.12.2010 04:44
Работа со строками на ассемблере (TASM) crashX Помощь студентам 3 03.06.2009 09:22




16:18.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru