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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2015, 12:36   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Assembler, команда MOV

Всем доброго времени суток.
Моя задача очень простая: в консоль вывести строку пять раз, используя циклическую конструкцию.
Собственно говоря, объявление строки:
Код:
sLol db 'blablabla',13,10,"$"
Так как API-функция WriteConsoleA будет мне портить содержание регистра ECX (который нужен мне для LOOP) - мне необходима ещё одна переменная в памяти:
Код:
iCounter db 5
Ну, и код вывода:
Код:
mov ecx,5;
lol:
mov iCounter,cl
push 0
push 0
push 12d
push offset sLol
push hStdout
call WriteConsoleA
mov ecx,0
mov cl,iCounter
loop lol
Вроде всё хорошо, всё компилировалось, но при выполнении программа падает ("Прекращена работа программы").
Помогите пожалуйста разобраться.
P.S. Это лабораторная в институте.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 26.09.2015, 12:49   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
sLol db 'blablabla',13,10,"$"
Потому что $ в конце ставится для работы с прерыванием DOS. В твоем случае нужно ставить 0.
Цитата:
push 0
push 0
Второй push должен, если я правильно помню, положить адрес на переменку, а ты туда 0 пихаешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2015, 12:56   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Второй push должен, если я правильно помню, положить адрес на переменку, а ты туда 0 пихаешь.
Ок, а как тогда узнать адрес переменной ?
И почему в консоли не отображаются символы типа этих - !&@?/
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 26.09.2015, 13:29   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я не проверял, но пример могу показать:
Код:
format PE console
entry start

include 'D:\fasmw16726\INCLUDE\win32a.inc'
 
section '.data' data readable writeable
message db 'hello world',0
member db ?
ou dd ?
l dd ?
r db 'Russian',0
section '.code' code readable executable

start:

 cinvoke setlocale,1,r


  ;Получаем хендл консоли
  invoke GetStdHandle, STD_OUTPUT_HANDLE
  mov [ou],eax
  mov ecx,5
 fori:

;CALL пример
 push ecx
   push 0
   push l
   push 11
   push message
   push [ou]
   call [WriteConsole]
pop ecx 

;INVOKE пример 
   invoke WriteConsole,[ou],message,11,l,0

 loop fori

  cinvoke getch

  invoke ExitProcess,0
section '.idata' import data readable
library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll'
 
import kernel,\
       ExitProcess,'ExitProcess',\
       WriteConsole,'WriteConsoleA',\
       GetStdHandle,'GetStdHandle'
 
import msvcrt,\
       setlocale,'setlocale',\
       printf,'printf',\
       getch,'_getch'
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2015, 14:12   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..всё работает, только в случае с "INVOKE" снимать со-стека CX нужно после функции:
Код:
mov ecx,5
fori:
push ecx
;CALL пример
;   push 0
;   push l
;   push 11
;   push message
;   push [ou]
;   call [WriteConsole]

;INVOKE пример 
   invoke WriteConsole,[ou],message,11,l,0

pop ecx
loop fori
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 26.09.2015, 14:36   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ой! Она там должна быть закоментирована!
Забыл
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2015, 16:11   #7
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Всем спасибо за помощь, я разобрался: моя проблема была в том, что мой счётчик iCounter был объявлен в секции констант.
Но я не решил следующую проблему: в консоль не хотят выводиться символы типа !#$%^&/
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 26.09.2015, 17:26   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Могу доказать обратное:
Безымянный.jpg
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2015, 19:40   #9
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

С моим недо-кодом я выяснил, что это дело не в символах, а в том, что у моей строки длинна ограничена до 12.
Юзать всякие invoke я не могу, ибо в задании лабораторной этого нет.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 27.09.2015, 06:31   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Юзать всякие invoke я не могу, ибо в задании лабораторной этого нет.
У вас в задании прописаны все операторы, которые вы можете использовать? Если нет, то прекращайте детский сад - это возможности языка.

Но если вам так хочется, то проверяйте соглашение, заменяйте на пуши или мовы с колл, и позаботитесь о выравнивании стека после.
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MOV Алексей Супрун Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 29.05.2013 23:32
PDP 11 - команда пересылки mov 27 27. почему это фатальная ошибка? 13xXx13 Помощь студентам 0 15.01.2012 23:34
Команда System: запуск программы в свёрнутом режиме, Не работает команда /min Me777 Общие вопросы C/C++ 0 12.07.2011 11:49
Программная эмуляция среды сопроцессора Intel 80x87. Команда FICOM(C++,Assembler). SeFlash Помощь студентам 0 20.12.2009 22:00
команда MOV, проблемы fermat_c Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 18.04.2008 19:19