На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Открыть файл, считать строку из 10 символов и вывести ее , Почему не работает мой код?
    ExpandedWrap disabled
      model small
      .stack 254
       
      .data
      fname db 'stroka1.txt',0h  
      des dw 0
      buff db 20 dup (?)
      .code
      start:
      mov ax,@data
      mov ds,ax
      mov es,ax
       
              mov ah,3dh ;открываем файл
          mov al,0
          mov dx,offset fname
          int 21h
          mov bx,ax
          
              mov ah,3fh ;читаем 10 символов
          mov dx, offset buff
          mov cx,10
          int 21h
       
              lea dx,buff ;выводим
              mov ah,9
              int 21h
       
      xor ah,ah
      int 16h
      mov ax, 4c00h   ; Завершение программы
      int 21h    
      end start


    У меня выводит много каких-то непонятных символов. В файле txt просто символы 35safqeeh4dgqgwdggq Прикреплённый файлПрикреплённый файлstroka1.txt (19 байт, скачиваний: 102)
      Просто при выводе тоже ищется конец строки '$', не находится, и вываливается весь мусор. Поставьте на последнее место "конец строки" и всё будет хорошо!
        1) Посмотрите всё же описание int 21h fn 9 - особенно в части определения, где закончить вывод.
        2) Зачем резервировать буфер в 20 байтов, если надо читать 10?
        3) Да и где гарантия, что это именно 20? директивы .RADIX что-то не видать... квалифицируйте систему счисления явно.

        Тогда станет понятно, что вместо
        ExpandedWrap disabled
          buff db 20 dup (?)

        должно быть
        ExpandedWrap disabled
          buff db 0Ah dup (?)
          term db '$'
          Цитата Akina @
          Да и где гарантия, что это именно 20? директивы .RADIX что-то не видать... квалифицируйте систему счисления явно.
          Зачем? По умолчанию используется десятичная. Это не include-файл, чтобы она оказалось неожиданно другой.
            Цитата Jin X @
            Зачем? По умолчанию используется десятичная.

            Всё, что не описано явно, имеет право быть как угодно. Количество [censored], напоровшихся на проблемы именно из-за надежд на некие умолчания, достаточно велико - какой смысл пополнять их ряды?
              Akina, не ну если загоняться по каждому поводу, тогда нужно при компиляции задавать 100500 ключей и прописывать десятки директив внутри каждого исходника.
              Ещё можно понять, когда значение по умолчанию может прыгать в разных версиях или опциях компилятора. А тут... мне вот даже интересно, какие могут быть проблемы из-за незаданного RADIX'а? Откуда может возникнуть не тот RADIX? :)
                Цитата Jin X @
                если загоняться по каждому поводу, тогда нужно при компиляции задавать 100500 ключей и прописывать десятки директив внутри каждого исходника.

                Вот это как раз и снимается соотв. инклюдом и заданием стандартных опций через переменные среды или ассоциацию типа.
                Цитата Jin X @
                какие могут быть проблемы из-за незаданного RADIX'а?

                Неправильная интерпретация значений числовых литералов - гарантированная проблема. И хорошо, что обычно - ещё на стадии компиляции...
                Цитата Jin X @
                Откуда может возникнуть не тот RADIX?

                Ну это не ко мне, это к гадалкам. А я лучше укажу явно - и заодно на гадалках сэкономлю.
                  Цитата Akina @
                  Неправильная интерпретация значений числовых литералов - гарантированная проблема.
                  С чего она будет интерпретирована неправильно-то? RADIX не может быть не равен 10, если он не задан...
                  В данном случае это явно лишнее.
                  Ну это примерно то же самое, что писать ASSUME CS:@CODE, DS:@CODE, ES:@CODE, SS:@CODE после .MODEL Tiny + .CODE... на всякий случай :)
                    Цитата Jin X @
                    Ну это примерно то же самое, что

                    Ну как бы .MODEL Tiny включает в себя и ASSUME CS:@CODE, DS:@CODE, ES:@CODE, SS:@CODE в точке входа. В то же время ничто не мешает такой программе использовать предопределённые блоки памяти (например, нулевой сегмент или там сегмент BIOS data, описанный в инклюде по типу BIOS_DATA SEGMENT AT 40h), настраивать на них сегментные регистры, и соответственно в коде, несмотря на моделю, появятся дополнительные ASSUME.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0336 ]   [ 17 queries used ]   [ Generated: 18.04.24, 21:14 GMT ]