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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2009, 22:05   #1
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию MASM: HelloWorld разобрался в коде, поправьте немного

в ассемблере 0, нашел в сети код консольной программы Hello World, кое как "собрал", "слинковал", работает =) теперь разбираюсь с кодом:

Код:
.386			;процессор
 .model flat,stdcall	;модель
option casemap:none	;опции

includelib F:\masm32\lib\kernel32.lib	;поключить библиотеку kernel32.lib

SetConsoleTitleA PROTO :DWORD	;...импортировать из нее следующие функции...
GetStdHandle PROTO     :DWORD
WriteConsoleA PROTO    :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO      :DWORD
Sleep PROTO            :DWORD

 .const	; секция где описаны константы

sConsoleTitle  db 'My First Console Application',0 ;что значит последний 0 и db?
sWriteText  db 'Hello world!'

 .code	; секция кода

Main PROC	;главная процедура, типа функции int_main(){...} в C++
  LOCAL hStdout :DWORD        ;локальная переменная hStdout типа DWORD

  push offset sConsoleTitle   ; заносим в стек константу sConsoleTitle, что значит offset?
  call SetConsoleTitleA	      ; вызываем процедуру

; то есть  вызванная процедура считывает параметры из стека, 
; то есть sleep(300); на delphi то же что и 
; push 300d 
; call sleep
; на асме?


  push -11
  call GetStdHandle ; теперь мы вызвали функцию GetStdHandle c параметром -11
  mov hStdout,EAX   ; результат функции записывается в регистр EAX

  push 0
  push 0
  push 16d	; последняя d значит december т.е. десятичная система счисления?
  push offset sWriteText
  push hStdout
  call WriteConsoleA ;это аналогично: WriteConoleA(hStdout, sWriteText, 16, 0, 0); на Delphi

  push 2000d ; после вызова WriteConsoleA стек очистился и его сразу можно использовать для след. функций.
  call Sleep

  ;выход                       
  push 0
  call ExitProcess

Main ENDP ; окончание функции Main

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

end Main
поправьте если где не так понял.
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 24.02.2009, 22:22   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,581
По умолчанию

Цитата:
includelib F:\masm32\lib\kernel32.lib ;поключить библиотеку kernel32.lib
подключили
Цитата:
sConsoleTitle db 'My First Console Application',0 ;что значит последний 0 и db?
db - выделение строки байт (в частности, символов). 0 в конце - конец строки.
Цитата:
push offset sConsoleTitle ; заносим в стек константу sConsoleTitle, что значит offset?
offset - смещение, проще говоря, адрес, а не значение переменной.
Цитата:
; то есть вызванная процедура считывает параметры из стека,
Передача параметров через стек - один из методов передачи параметров функциям
Цитата:
то есть sleep(300); на delphi то же что и
Верно.
Цитата:
call WriteConsoleA ;это аналогично: WriteConoleA(hStdout, sWriteText, 16, 0, 0); на Delphi
Ну да, примерно так.
Цитата:
push 16d ; последняя d значит december т.е. десятичная система счисления?
да
Цитата:
push 2000d ; после вызова WriteConsoleA стек очистился и его сразу можно использовать для след. функций.
Процедура сама сдвигает указатель вершины стека в момент возрата (см. RET N). Стек не очищается (из него исключаются только параметры, переданные процедуре).

Последний раз редактировалось Arigato; 24.02.2009 в 22:24.
Arigato вне форума Ответить с цитированием
Старый 24.02.2009, 22:32   #3
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Arigato, спасибо!
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 25.02.2009, 19:59   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
push -11
call GetStdHandle ; теперь мы вызвали функцию GetStdHandle c параметром -11
mov hStdout,EAX ; результат функции записывается в регистр EAX
Результат, наоборот, возвращается функцией в eax и записывается в hStdOut.
Десятичная по-английски decimal.
Somebody вне форума Ответить с цитированием
Старый 25.02.2009, 21:15   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
Код:
.const	; секция где описаны константы

sConsoleTitle  db 'My First Console Application',0 ;что значит последний 0 и db?
sWriteText  db 'Hello world!'
Вообще то неправильно. Это не константы, а инициализированные переменные. И поидее им место не в секции .const а в секции .data
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 25.02.2009, 21:25   #6
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Цитата:
Результат, наоборот, возвращается функцией в eax и записывается в hStdOut.
не так выразился.. ок
Цитата:
Вообще то неправильно. Это не константы, а инициализированные переменные. И поидее им место не в секции .const а в секции .data
программа работает, думаю на производительности особо не скажется )))
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 25.02.2009, 22:03   #7
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Ошибку нашёл.
Попробуйте поменять местами строки, т.е. написать их так:

Код:
.data
sWriteText  db 'Hello world!', 0
sConsoleTitle  db 'My First Console Application',0
Цитата:
push 16d ; последняя d значит december т.е. десятичная система счисления?
Должно быть 12. (кстати для десятичной системы можно не указывать d)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[MASM] Прыжок из программы в подпрограмму. SoundMan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 01.12.2008 18:41
Чем отличается Tasm от Masm veter_s_morya Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 17 21.07.2008 16:55
А где взять MASM RomanIgorevi4 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 06.07.2008 13:04
struct vs MASM format Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 09.05.2008 17:54