Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/496: Рейтинг темы: голосов - 496, средняя оценка - 4.56
Appostl
16 / 5 / 0
Регистрация: 30.12.2009
Сообщений: 93
1

Написать программу, выводящую строку "Hello World" на экран

20.10.2011, 12:51. Просмотров 95043. Ответов 41
Метки нет (Все метки)

Написать прогармму выводящую строку "Hello World" на экран

Заранее спасибо
1
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2011, 12:51
Ответы с готовыми решениями:

Программа "Hello World" из книги Крупника А. "Изучаем ассемблер" не выводит строку
Здравствуйте! :) Начал изучать Ассеблер по книге Крупника А. "Изучаем ассемблер". Переписал...

Написать программу на ассемблере, выводящую на экран строку 100 раз
Написать программу на ассемблере, выводящую на экран строку 100 раз.

Составьте программу, выводящую на экран 5 строк «Hello, World!»
Всем доброго времени суток! Есть задание: 1.Составьте программу, выводящую на экран 5 строк...

Напишите программу, выводящую на экран "бегущую строку"
Напишите программу, выводящую на экран "бегущую строку" (бегущую строку можно оформить в виде...

41
Ropsat
30 / 30 / 4
Регистрация: 04.03.2011
Сообщений: 67
20.10.2011, 14:05 2
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.MODEL SMALL
.STACK 100h
.DATA
    HelloMessage DB 'Hello World',13,10,'$'
.CODE
START:
    mov ax,@data
    mov ds,ax
    mov ah,9
    mov dx,OFFSET HelloMessage
    int 21h
    mov ah,4ch
    int 21h
END START
4
Mikl___
Ушел с форума
Автор FAQ
13769 / 6833 / 749
Регистрация: 11.11.2010
Сообщений: 12,270
21.10.2011, 05:47 3
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Appostl, еще два варианта программы
1) вывод через int 29h
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.286
.MODEL SMALL
.STACK 100h
.DATA
        HelloMessage DB 'Hello World',10,13
    num = $ - HelloMessage
.CODE
START:  push @data
        pop ds
    mov cx,num
a1: lodsb
        int 29h
    loop a1
        mov ah,4ch
        int 21h
end start
2) прямой вывод строки в видео память, выводит красные символы на черном фоне
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
.286
.MODEL SMALL
.STACK 100h
.DATA
        HelloMessage DB 'Hello World'
    num = $ - HelloMessage
.CODE
START:  push @data
        pop ds
    push 0B800h
    pop es
    mov ax,3
    int 10h
    mov di,0
    mov si,offset HelloMessage
    mov cx,num
    mov ah,0Ch
a1: lodsb
        stosw
    loop a1
        mov ah,4ch
        int 21h
end start
1
Ant1971on
270 / 265 / 11
Регистрация: 24.12.2010
Сообщений: 328
21.10.2011, 12:48 4
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Еще один хелловорд для полной коллекции
Код
CSEG SEGMENT
assume cs:cseg,ds:cseg
org 100h
start:	jmp begin
msg db 'Hello World!'
begin:	mov ah,40h
	mov bx,1
	mov cx,12
	mov dx,offset msg
	int 21h
	ret
CSEG ENDS
end start
2
Vadimych
637 / 480 / 12
Регистрация: 10.01.2011
Сообщений: 1,047
21.10.2011, 14:19 5
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

О функциях биос забыли.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.model tiny
.286
.code
org 100h
start:
mov ah,13h
xor dx,dx
mov cx,sizeof string
mov bp,offset string
mov bx,0ch
int 10h
ret
string db 'Goodbye, America'
end start
2
TexHuK
9 / 9 / 0
Регистрация: 19.10.2011
Сообщений: 102
22.10.2011, 11:30 6
я пытаюсь откомпилировать программу под виндовс, всплывающего окна стандартного окна с надписью hello word , но почему-то происходят ошибки указывающие на то, что процессы ExitProcess, MessageBoxA не известны, хотя все делаю как описано в тутариале.

компилировал по разному, даже пытался использовать параметры компиляции из экземпляров которые идут вместе с Tasm 5.0

в туторе написанно что компелировать надо так
tasm32 /m3 /ml program,,;
tlink32 /Tpe /aa program,program,,import32.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
;---[ CUT HERE ]-------------------------------------------------------------
 
.386                            ; Процессор (386+)
.model flat                     ; Использует 32-х битные
 
;регистры
 
 extrn          ExitProcess:proc                ; Функции API, которые
 extrn          MessageBoxA:proc                ; использует программа
 
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 ; С помощью директивы "extrn" мы указываем, какие API мы будем использовать;
 ; ExitProcess возвращает контроль операционной системе, а MessageBoxA      ;
 ; показывает классическое виндовозное сообщение.                           ;
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 
 .data
 szMessage       db      "Hello World!",0       ; Message for MsgBox
 szTitle         db      "Win32 rocks!",0       ; Title of that MsgBox
 
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 
                .code                           ; Поехали!
 
 HelloWorld:
                push    00000000h               ; Стиль MessageBox
                push    offset szTitle          ; Заголовок MessageBox
                push    offset szMessage        ; Само сообщение
                push    00000000h               ; Хэндл владельца
 
                call    MessageBoxA             ; Вызов функции
 
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 ; int MessageBox(                                                          ;
 ;   HWND hWnd,          // хэндл окна-владельца                            ;
 ;   LPCTSTR lpText,     // адрес текста сообщения                          ;
 ;   LPCTSTR lpCaption,  // адрес заголовка MessageBox'а                    ;
 ;   UINT uType          // стиль MessageBox'а                              ;
 ;  );                                                                      ;
 ;                                                                          ;
 ; Мы помещаем параметры в стек до вызова самой API-функции, и если вы      ;
 ; помните, стек построен согласно принципу LIFO (Last In First Out),       ;
 ; поэтому мы должны помещать параметры в перевернутом порядке (при всем    ;
 ; уважении к автору данного туториала, я должен сказать, что он не прав    ;
 ; вовсе не поэтому мы должны помещать данные в перевернутом порядке - прим.;
 ; пер.). Давайте посмотрим на краткое описание каждого из параметров этой  ;
 ; функции:                                                                 ;
 ;                                                                          ;
 ; ¦ hWnd: идентифицирует окно-владельца messagebox'а, который должен быть  ;
 ;   создан. Если этот параметр равняется NULL, у окна с сообщением не будет;
 ;   владельца.                                                             ;
 ; ¦ lpText: указывает на ASCIIZ-строку, содержащую сообщение, которое нужно;
 ;   отобразить.                                                            ;
 ; ¦ lpCaption: указывает на ASCIIZ-строку, содержащую заголовок окна       ;
 ;   сообщения. Если этот параметр равен NULL, будет использован заголовок  ;
 ;   по умолчанию.                                                          ;
 ; ¦ uType: задает флаги, которые определяют содержимое и поведение         ;
 ;   диалогового окна. Это параметр может быть комбинацией флагов.          ;
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 
                push    00000000h
                call    ExitProcess
 
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 ; VOID ExitProcess(                                                        ;
 ;   UINT uExitCode      // код выхода для всех ветвей                      ;
 ;  );                                                                      ;
 ;                                                                          ;
 ; Эта функция эквивалентна хорошо известному Int 20h или функциям 00, 4С   ;
 ; Int 21h. Она просто завершает выполнение текущего процесса. У нее только ;
 ; один параметр:                                                           ;
 ;                                                                          ;
 ; ¦ uExitcode: задает код выхода для процесса и всех ветвей, выполнение    ;
 ;   которых будет прервано вызовом данной функции. Используйте функцию     ;
 ;   GetExitCodeProcess, чтобы получить код возврата процесса, а функцию    ;
 ;   GetExitCodeThread, чтобы получить код возврата треда.                  ;
 ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
 
 end HelloWorld
 
;---[ CUT HERE ]-------------------------------------------------------------
Написать программу, выводящую строку "Hello World" на экран
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
29029 / 19161 / 7528
Регистрация: 22.10.2011
Сообщений: 33,392
Записей в блоге: 6
22.10.2011, 11:56 7
Надо прилинковать еще IMPORT32.LIB, тогда ошибок не будет:

F:\ASM50\BIN\TLINK32 -Tpe -aa hw F:\ASM50\LIB\IMPORT32.LIB
0
TexHuK
9 / 9 / 0
Регистрация: 19.10.2011
Сообщений: 102
22.10.2011, 12:22 8
Цитата Сообщение от UI Посмотреть сообщение
Надо прилинковать еще IMPORT32.LIB, тогда ошибок не будет:
Спасибо, все работает

правда я прилинковал эту библиотеку
d:\Assembler\TASM5Plus\LIB\imp32i.lib
0
Mikl___
Ушел с форума
Автор FAQ
13769 / 6833 / 749
Регистрация: 11.11.2010
Сообщений: 12,270
31.10.2011, 11:07 9
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

еще один способ
Assembler
1
2
3
4
5
6
7
8
9
.data
HELLO DB 'Здравствуй мир!',0 ;строка для вывода 
.code
MOV AH,0Eh ; на экран номер подфункции BIOS
mov si,offset HELLO ;SI указывает на строку
next: lodsb ;помещаем символ в AL и переходим к следующему символу,
 INT 10h ;выводим символ на экран
test al,al ;проверяем на конец строки
jnz next ;если нет — повторяем все сначала
2
Charles Kludge
Клюг
7658 / 3173 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
31.10.2011, 16:08 10
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

А можно и так:
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
49
; hello - example of tiny (one section) Win32 program
 
format PE console 4.0
 
include 'include\win32ax.inc'
ENABLE_PROCESSED_OUTPUT  = 00000001
 
    invoke  AllocConsole
    invoke  SetConsoleCP, 1251
    invoke  SetConsoleOutputCP, 1251
    invoke  GetStdHandle, STD_INPUT_HANDLE
        push    eax
        push    eax
    invoke  GetStdHandle, STD_OUTPUT_HANDLE
        push    eax
    invoke  SetConsoleMode, eax, ENABLE_PROCESSED_OUTPUT
    pop eax
    invoke  WriteConsole, eax, hello, msgsz, NULL, NULL
;   pop eax
    invoke  FlushConsoleInputBuffer
    pop eax
    invoke  ReadConsole, eax, buf, bufsz, cnt, NULL
;exit:
    invoke  FreeConsole
    invoke  ExitProcess,0
 
cnt dd  ?
buf db  10 dup(?)
bufsz   =   $ - buf
hello   db  'cp1251 Привет из консоли!',0
msgsz   =   $ - hello
; import data in the same section
 
data import
 
 library kernel32,'KERNEL32.DLL'
 
 import kernel32,\
    ExitProcess,'ExitProcess',\
    SetConsoleCP,'SetConsoleCP',\
    SetConsoleOutputCP,'SetConsoleOutputCP',\
    GetStdHandle,'GetStdHandle',\
    SetConsoleMode,'SetConsoleMode',\
    ReadConsole,'ReadFile',\
    WriteConsole,'WriteConsoleA',\
    FreeConsole,'FreeConsole',\
    FlushConsoleInputBuffer,'FlushConsoleInputBuffer',\
    AllocConsole,'AllocConsole'
end data
А теперь немного и лирики: я научил консоль cp1251 в полноэкранном режиме. Для этого нужно заменить виндовый %SystemRoot%\SYSTEM32\EGA.CPI на такой же из MS-DOS 6.22, в котором есть эта кодовая страница. В аттаче модифицированый EGA.CPI c моими sans-serif шрифтами.
Прога inuse(от MS ) служит для замены блокированых файлов в системных каталогах на ходу. Перегружаться всё равно придётся.
1
Charles Kludge
Клюг
7658 / 3173 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
31.10.2011, 16:13 11
аттачи забыл...
2
Вложения
Тип файла: zip INUSE.ZIP (19.8 Кб, 178 просмотров)
Тип файла: zip EGA_CPI.ZIP (9.8 Кб, 53 просмотров)
Mikl___
Ушел с форума
Автор FAQ
13769 / 6833 / 749
Регистрация: 11.11.2010
Сообщений: 12,270
25.11.2011, 10:19 12
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Еще один вариант
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; masm dos com #
.286 
.model tiny
.code
org 100h
 
start: mov bp,offset ABC
    mov ax,1303h
    mov bx,7
    mov cx,16
    xor DX,DX
    int 10h 
    retn
ABC db 'H',0Ah,'e',0Bh,'l',0Dh,'l',0Ch
    db 'o',0Bh,',',0Ah,' ',0Ah,'W',09h
    db 'o',08h,'r',07h,'l',06h,'d',05h
    db '!',02h,'!',02h,'!',02h
end start
0
Mikl___
Ушел с форума
Автор FAQ
13769 / 6833 / 749
Регистрация: 11.11.2010
Сообщений: 12,270
12.03.2012, 10:59 13
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Еще несколько вариантов:
Пример вызова 2 функции прерывания 21h
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; masm dos com #
.286
.model tiny
.code
org 100h
start:  mov si,offset string
    mov cx,N
    mov ah,2
@@: lodsb
    mov dl,al
    int 21h
    loop @b
    retn
string db 'Hello, world!'
N = $ - string
end start
Пример вызова 6 функции прерывания 21h
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
; masm dos com #
.286
.model tiny
.code
org 100h
start:  mov si,offset string
    mov cx,N
    mov ah,6
@@: lodsb
    mov dl,al
    int 21h
    loop @b
    retn
string db 'Hello, world!'
N = $ - string
end start
Пример вызова функции DOS через альтернативный обработчик прерывания 21h.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
; masm dos com #
.286
.model tiny
.code
org 100h
start: push offset RETURN     ;Занести в стек флаги, сегмент
        push cs                    ;и смещение адреса возврата
        pushf                      ;в обратном порядке.
        mov cl,9                 ;Функция: показать строку.
        mov dx,offset MESSAGE    ;Загрузить адрес сообщения.
        db 0EAh,0C0h,0,0,0     ;jmp far ptr 0:0C0h
RETURN: mov ah,4Ch               ;Завершить процесс через DOS.
        int  21h                   
MESSAGE db 'Hello, world!$'
end start
имитируем вызов int 21h
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
; masm dos com #
.286
.model tiny
.code
org 100h
start:
;получаем дальний адрес (cs:ip) обработчика 
;прерывания 21h из таблицы векторов прерывания
    push 0;сегментный адрес  таблицы векторов прерывания в es  
    pop es      
    mov di,es:[21h*4];смещение обработчика прерывания 21h в di
    mov si,es:[21h*4+2];сегмент обработчика прерывания 21h в si
    mov dx,offset string
    mov ah,9      ;номер функции
;три параметра в стек для возврата из прерывания
    pushf           
        push cs
        push offset @f  ;адрес возврата
    push si     ;cs для int 21h
    push di     ;ip для int 21h
    retf        ;подменяем cs и ip
@@: mov ah,4Ch      ;выход из программы
    int 21h
string db 'Hello, world!$'
end start
1
Charles Kludge
Клюг
7658 / 3173 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
12.03.2012, 11:15 14
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

DPMI client [FASM]
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
    format  MZ
 
    LF  equ 10
    CR  equ 13
 
    entry   _TEXT:start
 
    segment _TEXT use16
 
start:
    push    cs
    pop ds
    mov ax, ss
    mov cx, es
    sub ax, cx
    mov bx, sp
    shr bx, 4
    inc bx
    add bx, ax          ;release unused DOS memory
    mov ah, 4Ah
    int 21h
    mov ax, 1687h       ;DPMI host installed?
    int 2Fh
    and ax, ax
    jnz nohost
 
    push    es          ;save DPMI entry address
    push    di
    and si, si          ;requires host client-specific DOS memory?
    jz  nomemneeded
    mov bx, si
    mov ah, 48h         ;alloc DOS memory
    int 21h
    jc  nomem
    mov es, ax
nomemneeded:
    mov bp, sp
    mov ax, 0001        ;start a 32-bit client
    call    far [bp]        ;initial switch to protected-mode
    jc  initfailed
;now in protected-mode
; CS = 16-bit selector corresponding to real-mode CS
; SS = selector corresponding to real-mode SS (64K limit)
; DS = selector corresponding to real-mode DS (64K limit)
; ES = selector to program's PSP (100h byte limit)
; FS = GS = 0
    mov cx,1            ;get a descriptor for the 32-bit code segment
    mov ax,0
    int 31h
    jc  dpmierr
    mov bx,ax                   ; base selector
    mov dx,_TEXT32
    mov cx,dx
    shl dx,4
    shr cx,12                   ; now CX:DX = linear(flat) _TEXT32 addr
    mov ax,7            ;set base
    int 31h
    or  dx,-1
    xor cx,cx
    mov ax,8            ;set limit
    int 31h
    mov cx,cs
    lar cx,cx
    shr cx,8
    or  ch,40h          ;make a 32bit CS
    mov ax,9
    int 31h
    push    bx          ; _TEXT32 selector
    push    start32
    retf                ;jump to 32bit CS
nohost:
    mov dx, dErr1
error:
    mov ah, 9
    int 21h
    mov ax, 4C00h
    int 21h
nomem:
    mov dx, dErr2
    jmp error
initfailed:
    mov dx, dErr3
    jmp error
dpmierr:
    mov dx, dErr4
    jmp error
 
;   segment _DATA use16
 
szWelcome   db      "Good bye, ugly 16 bit!",CR,LF
        db  "Hello, world from DOS protected mode 32-bit client!",CR,LF,'$'
dErr1       db  "no DPMI host installed",CR,LF,'$'
dErr2       db  "not enough DOS memory for client initialisation",CR,LF,'$'
dErr3       db  "DPMI initialisation failed",CR,LF,'$'
dErr4       db  "no LDT descriptors available",CR,LF,'$'
 
;--- the 32-bit code segment
 
    segment _TEXT32 use32
 
start32:
    mov edx, szWelcome      ;print welcome message
    mov ah,9
    int 21h
    mov ah,0
    int 16h
    mov ax, 4C00h       ;return to DOS
    int 21h
1
Typoii
15 / 22 / 6
Регистрация: 13.10.2011
Сообщений: 167
12.03.2012, 11:43 15
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

И ещё 1 способ
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.386
    .model flat, stdcall
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib
.data
msg db "Hello World"
stdout dd ?
cWritten dd ?
.code
start:
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout,eax
invoke WriteConsoleA,stdout,ADDR msg,SIZEOF msg,ADDR cWritten,NULL
invoke ExitProcess,0
end start
Добавлено через 7 минут
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
По кол-ву кода от start до end start самая лучшая реализация
0
vital792
2008 / 1280 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
12.03.2012, 14:32 16
Цитата Сообщение от Typoii Посмотреть сообщение
самая лучшая реализация
ага - макросом, так любой код в одну строку можно уместить)
0
Charles Kludge
Клюг
7658 / 3173 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
14.03.2012, 22:46 17
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Графика, толсто.[FASM]
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    format MZ
    heap    0
    stack   100h
    entry   main:start
segment main    use16
start:  push    0                   
    pop fs                      ; vector table
    mov ax,data_segment
    mov ds,ax
    mov es,ax
    mov ax, 13h            ; modeX Graphics 320x200x256, 40x25, 8x8     
    int 10h
    mov eax, dword [fs:43h*4]
    mov dword [int43], eax     ; Get 8x8 chargen ptr
    mov si, hello
next:   call    gotoxy
    lodsb
    or  al,al
    jz  exit
    cmp al,20h  ; <space>?
    jnz @1
    add byte [Y], 11
    mov byte [X], 0
    jmp next
@1: movzx   ax,al
    shl ax, 3   ; ax*8
    push    si
    push    ds
    lds si, [int43]
    add si, ax
; Вывод на экран 
    mov cx, 8 
loo0:   lodsb
    mov bl, al
    push    cx
    mov cx, 8
loo1:   mov al, 20h
    rcl bl, 1
    jnc @@1
    mov al, 0DBh
@@1:    int 29h
    loop    loo1
    pop cx
    inc byte [es:Y]
    call    gotoxy
    loop    loo0
    pop ds
    pop si
    add byte [X], 8
    sub byte [Y], 8
    jmp next    
; выход
exit:   xor ah, ah
    int 16h
    mov ax, 03h
    int 10h
    mov ah, 4Ch
    int 21h
gotoxy: pusha
    mov ah,2
    xor bx,bx
    mov dx, word [es:XY]
    int 10h
    popa
    ret
segment data_segment use16 
int43:  dd  ?
XY:
X:  db  0
Y:  db  3
hello:  db  'Hello world',0
0
Charles Kludge
Клюг
7658 / 3173 / 383
Регистрация: 03.05.2011
Сообщений: 8,381
10.04.2012, 19:55 18
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Ну и ещё изврат - шлём сообщение самому себе через LAN Manager[FASM]:
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
        org 100h
        push    cs
        pop ax
        mov [rcpt_seg], ax
        mov [msg_seg], ax
        mov ax, 5E00h   ; DOS 3.1+ network
        mov dx, wkst_nm ; получить
        int 21h             ; имя локальной машины
        mov ax, 5F40h       ; LAN Manager Enhanced DOS
        mov dx, LM_MSG  ; отправить сообщение
        int 21h             ; самому себе
        int 20h
; LAN Manager NetMessageBufferSend parameter structure:
LM_MSG:                                 ;
; DWORD -> имя адресата (name for specific user, name* for domain wide name, * for broadcast)
rcpt_ofs:   dw  wkst_nm
rcpt_seg:   dw  ?
; DWORD -> текст сообщения
msg_ofs:    dw  msg
msg_seg:    dw  ?
msg_sz:     dw  msg_len     ; длина соощения
;
wkst_nm:    db  10h dup(?)  ; имя раб. станци
msg     db  'Hello, World!'
msg_len     =   $ - msg
2
HITMAN
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
11.04.2012, 06:45 19
Для DZENствующих!
Компилить этим зверем.
w 'MZ'
j 3c 0c
j 0c 'PE' 0 0
w 4c01; Тип процессора
w 0100; Число секций
a c e000; Размер дополнительного заголовка
w 0f01; Тип файла
w 0b01; "Магическое" значение
a e d4100000; Ссмещение точки входа
a 8 00004000; Начальный адрес загрузки (4 байта) *****
w 00100000; Выравнивание секций (4 байта)
w 00020000; Выравнивание в файле (4 байта)
w 0400; Старшая версия Windows (2 байта)
a 6 0400 ;Старшая версия подсистемы
a 6 00200000; Размер загруженного файла
w 30010000; Размер всех заголовков в файле (4 байта)
a 4 0200; Подсистема: 02 - графическая, 03 - консольная
a 2 00001000; Зарезервированный размер стека (4 байта)
w 00100000; Выделенный размер стека (4 байта)
w 00001000; Зарезервированный размер кучи (4 байта)
w 00100000; Выделенный размер кучи (4 байта)
a 4 10000000; Число элементов каталога смещений (4 байта)
a 8 56100000; смещение таблицы импорта (4 байта)
w 3c000000; размер таблицы импорта (4 байта)
; Начало таблицы секций
a 78;Первая секция импорта
w 00100000; размер секции в памяти
w 00100000; смещение секции относительно адреса загрузки
w 00020000; размер данных секции в файле
w 00020000; смещение начала данных секции в файле
a 0c 400000c0; атрибуты первой секции
; Секция 1 *************************************************
s 0200

l user32 'User32.dll' 0 0
l _user32 0 0'MessageBoxA'0

l kernel32 'Kernel32.dll' 0 0; имя 2 модуля
l _kernel32 0 0'ExitProcess'0
;w 0 0'LoadLibraryA'0

l __user32 ^_user32 0 0 00000000; таблица поиска 1
l __kernel32 ^_kernel32 0 0 00000000; таблица поиска 2

; 1 IAT
l MessageBox
w ^_user32 0000;Смещение таблицы поиска
w 00000000

; 2 IAT
l ExitProcess
w ^__kernel32 0000
;l LoadLibrary 00000000
w 00000000

; таблица импорта:
; 1 модуль
w ^__user32 0000; указатель на 1 таблицу поиска
a 8; 2 пустых поля
w ^user32 0 0; указатель на имя 1 модуля
w ^MessageBox 0000; указатель на 1 IAT

; 2 модуль
w ^__kernel32 0000; указатель на 2 таблицу поиска
a 8; 2 пустых
w ^kernel32 0 0; указатель на имя 2 модуля
w ^ExitProcess 0000; указатель на 2 IAT
j a0
; последняя запись - все нули
l caption 'translator'20'version'20'1.0'0
l text 'Hi! I' 27 'm the' ' example' ' program!'0
; помещаем в стек параметры MessageBoxA
w 6a00
w 68 @caption
w 68 @text
w 6a00
; вызываем MessageBoxA
w ff15 @MessageBox
; помещаем в стек параметр (0)
w 6a00
; вызываем ExitProcess
w ff15 @ExitProcess
1
Mikl___
Ушел с форума
Автор FAQ
13769 / 6833 / 749
Регистрация: 11.11.2010
Сообщений: 12,270
11.04.2012, 07:14 20
IOAN, так придется показывать, как создать MessageBox на разных диалектах ассемблера, а их штук двадцать наберется. Лучше по MessageBox создать отдельную тему и я мог бы показать, как только на MASM создать MessageBox 10 способами
0
11.04.2012, 07:14
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2012, 07:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Написать программу, выводящую на экран работающие "электронные часы"
Задача. Написать программу, выводящую на экран работающие &quot;электронные часы&quot; показывающие текущее...

Написать программу выводящую на экран снежинку из символа "*"
- Написать программу выводящую на экран снежинку из символа &quot;*&quot; (Через: Procedure/Function)

Ввести строку. Заменить все буквы "е" и "а" в тексте на "8" , "4" и "6". Вывести на экран модифицированную строку
Ввести строку. Заменить все буквы &quot;е&quot; и &quot;а&quot; в тексте на &quot;8&quot; , &quot;4&quot; и &quot;6&quot;. Вывести на...

Составить программу, выводящую строку "каждое слово вертикально"
Составить программу, выводящую строку &quot;каждое слово вертикально, выровненные по верхнему краю. В...


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.