Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2013, 21:49   #1
Unseen_Madness
Пользователь
 
Регистрация: 23.09.2013
Сообщений: 14
По умолчанию Программа ввода-вывода в ассемблер(маш. код)

Здравствуйте,у меня задание: написать программу ввода-вывода (строка текста-строка символов с клавиатуры-строка текста). Программу написала... Первая строка выводится, но когда дело доходит до ввода с клавиатуры, программа говорит мне "нет". Я понимаю, что ошибка моя и даже примерно представляю, в чем она, но разобраться не могу...
Вот моя программа:
hu.zip
Вот скрин:
скрин.jpg
Unseen_Madness вне форума Ответить с цитированием
Старый 24.10.2013, 11:10   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Unseen_Madness, расскажите, кто Вас и, главное, ЗАЧЕМ мучает?!
Вы продолжаете писать программы напрямую через Hex-редактор в машинных кодах?!
И это без вариантов? (по другому никак нельзя?)
Какой цели добиваются ваши преподаватели?

Ладно. пока Вы не ответили, допустим, что Вам это действительно надо.
Тогда расскажите, как Вы это делаете?
Вы же, прежде чем ввести машинные коды, откуда то их получаете? Откуда?
Возможно (если уж этому Вас учат), Вам нужно сначала написать программу на Ассемблере, потом проставить машинные коды, потом проставить адреса (при проставлении кодов ещё может быть неизвестна, где будет расположен адрес, если ссылка осуществляется вперёд). Как Вы это делаете?
И если я прав и Вы сначала пишете программу (пусть на бумажке) на Ассемблере, то где её код?!

а та программа, которую Вы выложили, после дизассемблера выглядит (в чёрновом варианте) примерно так:
Код:
seg_a           segment byte public
                assume  cs:seg_a, ds:seg_a
  
  
                org     100h
  
hu              proc    far
  
start:
                mov     dx,offset mess1        ; 
                mov     ah,9
                int     21h                     ; DOS Services  ah=function 09h
                                                ;  display char string at ds:dx
mess1           db       'Wwedite 5 simwolow', 0Dh, 0Ah, '$'
                db      0BAh, 39h, 2Dh,0B4h, 01h,0CDh
                db       21h, 24h,0BAh, 3Bh, 35h,0B4h
                db       01h,0CDh, 21h, 24h,0BAh, 43h
                db       3Dh,0B4h, 01h,0CDh, 21h, 24h
                db      0BAh, 4Bh, 45h,0B4h, 01h,0CDh
                db       21h, 24h,0BAh, 55h, 4Dh,0B4h
                db       01h,0CDh, 21h, 0Dh, 0Ah, 24h
                db      0BAh, 66h, 57h,0B4h, 09h,0CDh
                db      '!Spasibo', 0Dh, 0Ah, '$'
                db      73 dup (0)
  
hu              endp
  
seg_a           ends
  
                end     start
обратите внимание, что данные у Вас располагаются прямо в середине выполняемого кода. т.е., после того, как фукнция DOS выведет сообщения, следующим байтом кода оказывается буква "W" (у неё код код 57h, машинная команда, соответствующая этому коду: push di и т.д.

т.е. происходит попытка выполнить такой код:
Код:
57                           push        di
7765                         ja          00000006F  ----- (1)
646974652035                 imul        si,w,fs:[si][65],03520 ;"5 "
207369                       and         [bp][di][69],dh
6D                           insw
776F                         ja          000000085  ----- (2)
6C                           insb
6F                           outsw
770D                         ja          000000027  ----- (3)
0A24                         or          ah,[si]
BA392D                       mov         dx,02D39 ;"-9"
B401                         mov         ah,001 ;""
CD21                         int         021
24BA                         and         al,0BA ;"║"
3B35                         cmp         si,[di]
B401                         mov         ah,001 ;""
CD21                         int         021
24BA                         and         al,0BA ;"║"
43                           inc         bx
3DB401                       cmp         ax,001B4 ;"┤"
CD21                         int         021
24BA                         and         al,0BA ;"║"
4B                           dec         bx
45                           inc         bp
B401                         mov         ah,001 ;""
CD21                         int         021
24BA                         and         al,0BA ;"║"
55                           push        bp
4D                           dec         bp
B401                         mov         ah,001 ;""
CD21                         int         021
0D0A24                       or          ax,0240A ;"$
"
BA6657                       mov         dx,05766 ;"Wf"
B409                         mov         ah,009 ;"	"
CD21                         int         021
53                           push        bx
7061                         jo          0000000B1
7369                         jae         0000000BB
626F0D                       bound       bp,[bx][0D]
0A24                         or          ah,[si]
Вы именно этого и добиваетесь?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.10.2013, 12:29   #3
Unseen_Madness
Пользователь
 
Регистрация: 23.09.2013
Сообщений: 14
По умолчанию

Нет, я добивалась примерно следующего:
Код HTML:
MOV DX 0701
MOV AH 09
INT 21
W
w
e
d
i
t
e
SP
5
SP
s
i
m
w
o
l
o
w
CR
LF
$
MOV DX 392D
MOV AH 01 функция эхо
INT 21
$
MOV DX 3B35
MOV AH 01
INT 21
$
MOV DX 433D
MOV AH 01
INT 21
$
MOV DX 4B45
MOV AH 01
INT 21
$
MOV DX 554D
MOV AH 01
INT 21
CR
LF
$
MOV DX 6657
MOV AH 09
INT 21
S
p
a
s
i
b
o
CR
LF
$
Если я правильно понимаю, то ошибка у меня где-то здесь:
Код HTML:
MOV DX 392D
MOV AH 01 функция эхо
INT 21
$
MOV DX 3B35
MOV AH 01
INT 21
$
MOV DX 433D
MOV AH 01
INT 21
$
MOV DX 4B45
MOV AH 01
INT 21
$
MOV DX 554D
MOV AH 01
INT 21
CR
LF
$
Но к сожалению, я просто не знаю, в чем она и как ее исправить.
Адреса я просчитала.
Unseen_Madness вне форума Ответить с цитированием
Старый 24.10.2013, 12:34   #4
Unseen_Madness
Пользователь
 
Регистрация: 23.09.2013
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Unseen_Madness, расскажите, кто Вас и, главное, ЗАЧЕМ мучает?!
Вы продолжаете писать программы напрямую через Hex-редактор в машинных кодах?!
И это без вариантов? (по другому никак нельзя?)
Какой цели добиваются ваши преподаватели?
Как я уже говорила, это лабораторные. Дело в том, что к курсу они никакого отношения, по сути, не имеют и сделаны "чтобы лучше понять структуру ЭВМ". Так что все это оставлено на самотек, под самостоятельный разбор. К слову, я и ассемблер-то никогда не изучала)
Unseen_Madness вне форума Ответить с цитированием
Старый 24.10.2013, 13:26   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
MOV DX 0701
MOV AH 09
INT 21
W
w
e
d
i
вот! в этом и ошибка. Вы не понимаете процесс выполнения!

Вот смотрите. Есть машинный код. (для простоты берём COM программу). Этот код загружается в память ОС и выполняется процессором из памяти последовательно (исключая команды перехода, конечно) - команда за командой (каждая команда занимает разное число байт, но сейчас речь о другом). Разделения на то, что это - команда или данные - НЕТ!
Понимаете - НЕТ! Процессор, встретив байты 57 77 65 64 69 74 воспринимает их как машинные КОМАНДЫ, а не как текст 'Wwedit'!!
Поэтому, ваша задача, как программиста, обеспечить так, чтобы выполнение НЕ ПОПАДАЛО в те байты, где у Вас находится не выполняемый код, а ваши данные!
Делать это можно разными способами.
вариант 1. Располагать данные прямо в код, но ставить команды перехода так, чтобы выполнение перепрыгивало через данные.
выглядеть это будет примерно так:
Код:
                org     100h
  
hu              proc    far
  
start:
                mov     dx,offset mess1        ; 
                mov     ah,9
                int     21h                     ; DOS Services  ah=function 09h
                                                ;  display char string at ds:dx
                jmp  metka1
mess1           db       'Wwedite 5 simwolow', 0Dh, 0Ah, '$'

metka1:
                mov         dx,02D39h 
                mov         ah,001
                int           021h
......
второй вариант. в конце программы пишем команду завершения выполнения.
и все нужные данные располагаем после этого кода:
Код:
start:
                mov     dx,offset mess1        ; 
                mov     ah,9
                int     21h                     ; DOS Services  ah=function 09h
                                                ;  display char string at ds:dx

                mov         dx,02D39h
                mov         ah,001h 
                int           021h
.....
 <ТУТ только КОД - ДАННЫЕ ВСЕ НИЖЕ!!!!! >

          mov ax,4c00h       ;функция выхода из программы
          int 21h
mess1           db       'Wwedite 5 simwolow', 0Dh, 0Ah, '$'
mess2           db       '!Spasibo', 0Dh, 0Ah, '$'
buf               db      73 dup (?)
так немного понятнее?!



кстати, вот пример программы с вводом с клавиатуры (просто пример, взял готовый у себя в папке):
Код:
        model   tiny
        .code
        org     100h

start:    
;НАЧАЛО ПРОГРАММЫ

    mov dx,offset txt1 
    mov ah,9h 
    int 21h 

    mov ah, 0ah 
    mov dx,offset buftext
    int 21h 

    lea di, buftext+1 
    mov bh, 0
    mov bl, [di] 
    mov byte ptr [di+bx+1], '$'

    mov dx,offset txt2
    mov ah,9h 
    int 21h 

    mov dx,offset buftext+2
    mov ah,9h 
    int 21h 

    ; ожидание нажатия любой клавиши 
    mov ah, 0h  
    int 16h 
    ; выход в операционную систему
    mov ah, 4ch  
    int 21h 


maxl equ 50 

txt1 db 13,10,13,10,'Input your name: ','$'
txt2 db 13,10,13,10,'Привет, ','$'

buftext db maxl+1, ?, 80 dup(0) 


end start;КОНЕЦ ПРОГРАММЫ

p.s.
Цитата:
Как я уже говорила, это лабораторные. Дело в том, что к курсу они никакого отношения, по сути, не имеют и сделаны "чтобы лучше понять структуру ЭВМ". Так что все это оставлено на самотек, под самостоятельный разбор. К слову, я и ассемблер-то никогда не изучала)
сочувствую. Хотя, конечно, ваше стремление разобраться и изучить весьма и весьма похвально!!

Вы не ответили на вопрос - КАК вы это делаете (я про написание программы в машинных кодах)! Откуда Вы берёте сами машинные коды для Ассеблерных команд?

Последний раз редактировалось Serge_Bliznykov; 24.10.2013 в 13:30.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.10.2013, 14:21   #6
Unseen_Madness
Пользователь
 
Регистрация: 23.09.2013
Сообщений: 14
По умолчанию

Спасибо большое, попытаюсь разобраться)
Пишу в коде ассемблера, затем, пользуясь табличкой, перевожу его в машинный)
Unseen_Madness вне форума Ответить с цитированием
Старый 24.10.2013, 15:27   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

пожалуйста. Если будут вопросы - пишите, будем вместе разбираться..

Цитата:
Пишу в коде ассемблера, затем, пользуясь табличкой, перевожу его в машинный)
когда надоест или устанете или поймёте, что уже овладели "табличным" методом перевода, можете воспользоваться любым компилятором ассемблера. например, TASM
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для ввода строковых данных с клавиатуры. Запретить ввод пробела в строку (Ассемблер) Victor Babin Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 05.12.2012 09:38
Написать рекурсивную процедуру для ввода с клавиатуры последовательности чи-сел (конец ввода – 0) и вывода её на экран в обратном netiv Паскаль, Turbo Pascal, PascalABC.NET 1 17.02.2012 18:14
ассемблер. нужно написать собственные процедуры ввода-вывода Kuroi_Aida Фриланс 2 15.02.2012 12:13
Программа с минимальными задержками ввода-вывода Zarom Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 22.06.2011 20:10
Программа ввода и вывода последовательности символов(Assembler) WST Помощь студентам 1 01.04.2008 12:33