Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/47: Рейтинг темы: голосов - 47, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 19.03.2018
Сообщений: 2
1

Вывод на экран в SASM

19.03.2018, 16:42. Показов 9727. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. У меня на компе стоит Linux, пишу программы на языке ассемблера в SASM (компилятор в настройках - MASM, ибо учим именно его). Через Wine все отлично работает. Однако есть проблема - в этой вариации даже стандартный Hello World не дает вывода слов на экран. В винде нас учат пользоваться WriteConsoleA и GetStdHandle, и преподаватель говорит, что моя проблема может сводиться к дексриптору вывода - но гугление таковых для Linux ничего стоящего не дало. При этом в проектах SASM можно найти пример Hello World'а, который выводит заветный текст:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
.386
.model flat, stdcall
option casemap :none
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\kernel32.lib
.code
start:
      print "Hello world"
      exit
end start
Как мне решить эту проблему? Заранее спасибо с:
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2018, 16:42
Ответы с готовыми решениями:

SASM-вывод из сопроцессора
Нужно вывести с регистра st0 значение которое туда записывается в ходе математических операций. Сам...

При работе в IDE SASM программа выводит текст, при самостоятельном пуске - экран пустой (NASM, Ubuntu)
Доброго времени суток! Совсем недавно стал писать на NASM под linux. Узнал что есть такая...

Не могу понять как делать вывод на экран структуры STUDENT на заполнение и вывод данных на экран
Добрый вечер. Вот задание и мой код программы на C++ Не выходит нормально реализовать 3е...

Среда разработки SASM
Скачал среду разработки SASM,хотел скопировать и вставить код,но что-то не сработало,подскажите где...

15
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
19.03.2018, 16:54 2
Запустил в Windows эту программу - вывела строку и тут же закрылась.
Попробуйте сделать задержку на ввод Enter.
Например, как в этой теме
Реализация поиска k-го наименьшего элемента в массиве
Или сейчас выделю из него минимальный пример.

Добавлено через 4 минуты
Только пути к inc и lib поменяйте на собственные и, возможно, сократите их количество
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.686P
.model flat, stdcall
option casemap: none
 
        include d:\masm32\include\windows.inc
 
        include d:\masm32\include\user32.inc
        include d:\masm32\include\kernel32.inc
        include d:\masm32\include\masm32.inc
        include d:\masm32\include\msvcrt.inc
 
        includelib d:\masm32\lib\user32.lib
        includelib d:\masm32\lib\kernel32.lib
        includelib d:\masm32\lib\masm32.lib
        includelib d:\masm32\lib\msvcrt.lib
.data
        aszMsgHello     db      0Dh, 0Ah, 'Hello', 0Dh, 0Ah, 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
.code
 
start   proc
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
 
        ;вывод исходных данных
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgHello,\
                LENGTHOF aszMsgHello - 1, ADDR BufLen, NULL
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
start   endp
 
end     start
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,124
Записей в блоге: 12
19.03.2018, 21:04 3
Вместо WriteConsole и ReadConsole лучше использовать WriteFile и ReadFile (параметры те же, так что можно просто тупо заменить их и всё). Суть в том, что при перенаправлении вывода в файл WriteConsole ничего не выведет ни в файл, ни на экран...
1
ФедосеевПавел
19.03.2018, 21:13
  #4

Не по теме:

Да, это известный факт, но в библиотеках masm32 используется WriteConsole и именно по этим примерам я и учился. Может быть и не только я. Замена на эквивалент вызовет замешательство у новичков. Кроме того, иногда просят менять цвет и позицию символов - это возможно при использовании WriteFile?

0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,124
Записей в блоге: 12
19.03.2018, 22:30 5
Для студентов можно вообще использовать printf/scanf (из тех работ, что делал студентам, проблем не было).
С цветами всё в порядке:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
.686P
.MODEL Flat,StdCall
OPTION CASEMAP:NONE
 
INCLUDE         \MASM32\INCLUDE\WINDOWS.INC
INCLUDE         \MASM32\INCLUDE\KERNEL32.INC
INCLUDE         \MASM32\INCLUDE\MSVCRT.INC
 
INCLUDELIB      \MASM32\LIB\KERNEL32.LIB
INCLUDELIB      \MASM32\LIB\MSVCRT.LIB
 
.DATA
 
Msg1            DB      'Hello from WriteFile !!!',13,10
Msg2            DB      'Hello from printf !!!',13,10,0
 
.DATA?
 
Counter         DD      ?
 
.CODE
 
Start:
 
                invoke  GetStdHandle, STD_OUTPUT_HANDLE
                mov     ebx,eax
 
                invoke  SetConsoleTextAttribute, ebx, FOREGROUND_RED or FOREGROUND_GREEN or FOREGROUND_INTENSITY
                invoke  WriteFile, ebx, ADDR Msg1, LENGTHOF Msg1, ADDR Counter, 0
 
                invoke  SetConsoleTextAttribute, ebx, FOREGROUND_BLUE or FOREGROUND_GREEN or FOREGROUND_INTENSITY
                invoke  crt_printf, ADDR Msg2
 
                invoke  ExitProcess, NULL
 
END             Start
Добавлено через 8 минут
Ну и с позицией тоже всё нормально:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
.686P
.MODEL Flat,StdCall
OPTION CASEMAP:NONE
 
INCLUDE         \MASM32\INCLUDE\WINDOWS.INC
INCLUDE         \MASM32\INCLUDE\KERNEL32.INC
INCLUDE         \MASM32\INCLUDE\MSVCRT.INC
 
INCLUDELIB      \MASM32\LIB\KERNEL32.LIB
INCLUDELIB      \MASM32\LIB\MSVCRT.LIB
 
.DATA
 
Msg1            DB      'Hello from WriteFile !!!',13,10
Msg2            DB      'Hello from printf !!!',13,10,0
 
.DATA?
 
Counter         DD      ?
 
.CODE
 
Start:
 
                invoke  GetStdHandle, STD_OUTPUT_HANDLE
                mov     ebx,eax
 
                invoke  SetConsoleCursorPosition, ebx, 3+5*65536
                invoke  SetConsoleTextAttribute, ebx, FOREGROUND_RED or FOREGROUND_GREEN or FOREGROUND_INTENSITY
                invoke  WriteFile, ebx, ADDR Msg1, SIZEOF Msg1, ADDR Counter, 0
 
                invoke  SetConsoleCursorPosition, ebx, 20+10*65536
                invoke  SetConsoleTextAttribute, ebx, FOREGROUND_BLUE or FOREGROUND_GREEN or FOREGROUND_INTENSITY
                invoke  crt_printf, ADDR Msg2
 
                invoke  crt_getchar
                invoke  ExitProcess, NULL
 
END             Start
2
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
19.03.2018, 22:39 6
Цитата Сообщение от Andrew104109993 Посмотреть сообщение
Через Wine все отлично работает. Однако есть проблема - в этой вариации даже стандартный Hello World не дает вывода слов на экран.
Вам нужен хелло под читый линукс?
0
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
20.03.2018, 01:51 7
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Вам нужен хелло под читый линукс?
если да, то флаг тебе в руки..
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SECTION .data
msg     db "Hello, world!",0xa  
len     equ $ - msg
 
SECTION .text
global _start           ; точка входа
_start:
        mov eax, 4      ; системный вызов "write"
        mov ebx, 1      ; устройство "экран"
        mov ecx, msg    ; указатель адреса сообщения
        mov edx, len    ; длина
        int 0x80        ; вызов прерывания
 
        mov eax, 1      ; системный вызов "exit"
        mov ebx, 0      ; код возврата "правильно"
        int 0x80        ; вызов прерывания
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.03.2018, 07:09 8

Не по теме:

proc3nt, зачем вы оффтопите?
Топикстартер понимает программирование, но у него проблема в том, что в ВУЗе преподают masm32 и программа должна быть на masm32. Но у человека на компьютере Linux и попытки начать программирование в эмуляторе Windows упираются в то, что даже HelloWorld не работает (не выводит сообщение на экран) при формально корректной программе.
Смысл подсовывать ему код на FASM?
Задача - нужно понять что делать в Wine для вывода строки.


Andrew104109993, а не может случится так, что вы компилируете программу не как консольную, а как GUI (не те параметры командной строки у компоновщика - link)?
0
Jin X
20.03.2018, 11:17
  #9

Не по теме:

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Смысл подсовывать ему код на FASM?
На NASM

0
ФедосеевПавел
20.03.2018, 12:55
  #10

Не по теме:

А-а-а! Ну, тогда наоборот, молодец. На NASM, программа под Linux - при ответе на другой вопрос топикстартера - нет, это не офтоп.

0
0 / 0 / 0
Регистрация: 19.03.2018
Сообщений: 2
20.03.2018, 20:15  [ТС] 11
Нет, я хочу продолжить работать в SASM'е, который запускается словно приложение для винды. Идея в том, что на чистом линуксе я так и не допер, как писать/компилировать/отлаживать, а Wine и SASM дает, и OllyDbg.
(Что тут остальные написали - не очень хорошо понятно. Кого слушать, и что конкретно писать, простите...)
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,124
Записей в блоге: 12
20.03.2018, 20:47 12
Andrew104109993, учитесь чётко выражать свои мысли: что именно вам нужно... вместо пространных бесед.
Потому что лично я до конца не понял.

Цитата Сообщение от Andrew104109993 Посмотреть сообщение
пример Hello World'а, который выводит заветный текст
Это пример на MASM32. Чтобы запустить его в SASM, нужно зайти в настройки и выбрать MASM.

Если нужен пример на NASM, тогда пишите так:
Assembler
1
2
3
4
5
6
7
8
%include "io.inc"
 
section .text
global CMAIN
CMAIN:
    PRINT_STRING "Hello World!"
    xor eax, eax
    ret
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.03.2018, 20:50 13
Слушать всех по очереди.
Начните с меня. У меня несколько мыслей.
1. При компиляции вы ошиблись и скомпилировали программу, как GUI приложение, а нужно как консольное.
2. Возможно программа выполняется, но консольное окно быстро закрывается - нужно добавить паузу (код в моём сообщении - только пути к библиотекам скорректируйте).
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,124
Записей в блоге: 12
20.03.2018, 20:56 14
Вообще, SASM есть и под Linux, поэтому, по идее, этот же исходник (на NASM) должен компилиться и под Linux в соответствующей версии SASM'а.

Добавлено через 2 минуты
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
При компиляции вы ошиблись и скомпилировали программу, как GUI приложение, а нужно как консольное.
Настройки в SASM для MASM по умолчанию установлены в компиляцию консольной версии.

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Возможно программа выполняется, но консольное окно быстро закрывается
При запуске проги из-под SASM вывод идёт в специальное окно, которое после завершения программы никуда не девается.

Добавлено через 3 минуты
Цитата Сообщение от Andrew104109993 Посмотреть сообщение
Однако есть проблема - в этой вариации даже стандартный Hello World не дает вывода слов на экран
В какой такой этой вариации? Какой такой стандартный Hello World? Если не даёт, то что происходит (ошибка компиляции, ошибка при запуске, просто запускается и сразу выходит, etc...)?

В общем...
Цитата Сообщение от Jin X Посмотреть сообщение
учитесь чётко выражать свои мысли
2
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.03.2018, 21:24 15
Jin X, Andrew104109993, тогда следующее соображение
3. Перенаправление вывода WriteConsole невозможно, поэтому и не выводится в дополнительном окне. Как уже ранее отмечал Jin X - можно заменить WriteConsole на WriteFile, а ReadConsole на ReadFile.
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,124
Записей в блоге: 12
20.03.2018, 21:49 16
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
тогда следующее соображение
Макрос print использует функцию StdOut библиотеки masm32.lib, которая использует WriteFile.

macros.asm:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    print MACRO arg1:REQ,varname:VARARG      ;; display zero terminated string
        IFNDEF __UNICODE__
          invoke StdOut,expand_prefix(reparg(arg1))
        ELSE
          invoke StdOutW,expand_prefix(reparg(arg1))
        ENDIF
      IFNB <varname>
        IFNDEF __UNICODE__
          invoke StdOut,chr$(varname)
        ELSE
          invoke StdOutW,chr$(varname)
        ENDIF
      ENDIF
    ENDM
stdout.asm:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
StdOut proc lpszText:DWORD
 
    LOCAL hOutPut  :DWORD
    LOCAL bWritten :DWORD
    LOCAL sl       :DWORD
 
    invoke GetStdHandle,STD_OUTPUT_HANDLE
    mov hOutPut, eax
 
    invoke StrLen,lpszText
    mov sl, eax
 
    invoke WriteFile,hOutPut,lpszText,sl,ADDR bWritten,NULL
 
    mov eax, bWritten
    ret
 
StdOut endp
Добавлено через 1 минуту
(зачем промежуточную переменную sl сделали, когда можно было сразу eax передавать?)
1
20.03.2018, 21:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2018, 21:49
Помогаю со студенческими работами здесь

SASM Получить значение выражения
Прошу помощи, сам не могу разобраться Y=(1*2)+(3*4)+(5*6)+ ... +((2*n-a)*(2*n)).

Как научиться работать в среде Sasm?
Кто может научить пользоваться и работать в среде sasm?

Ubuntu 11.10 Sasm+Squid+Samba Настройка сетевых карт
Добрый день. Друзья настраиваю Проксик. Все поставил но вот не могу понять года 3 назад настраивал...

вывод на экран случайного одномерного массива,ввод с клавиатуры одномерного массива и вывод его на экран.и все это в одной проге.как это сделать?
надо чтобы при запуске прграммы в паскале сначала вывелся на кран одномерный случайный массив,потом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru