Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Appostl
15 / 4 / 1
Регистрация: 30.12.2009
Сообщений: 93
#1

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

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

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

Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2011, 12:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Написать программу, выводящую строку "Hello World" на экран (Assembler):

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

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

Необходимо строку тип ""str1" "str2"",0 преобразовать в строку типа
Необходимо строку тип ""str1" "str2"",0 преобразовать в строку типа "str2",0...

Написать программу, выводящую на экран флаг Бангладеша
Здравствуйте ! Необходимо написать программу на Ассемблере, выводящую на...

Написать программу выводящую на линейку семисегментных индикаторов АЛС 318 бегущую строку
Помогите с программой: Написать программу выводящую на линейку симесигментных...

Разработать алгоритм и написать резидентную программу, выводящую на экран характеристики компьютера
Если можете, помогите с прогой.....выскакивает какая-то ошибка, а как ее...

40
Ropsat
29 / 29 / 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
3
Mikl___
Автор FAQ
11379 / 5922 / 535
Регистрация: 11.11.2010
Сообщений: 10,938
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
265 / 260 / 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
635 / 478 / 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 / 1
Регистрация: 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
25624 / 17177 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 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 / 1
Регистрация: 19.10.2011
Сообщений: 102
22.10.2011, 12:22 #8
Цитата Сообщение от UI Посмотреть сообщение
Надо прилинковать еще IMPORT32.LIB, тогда ошибок не будет:
Спасибо, все работает

правда я прилинковал эту библиотеку
d:\Assembler\TASM5Plus\LIB\imp32i.lib
0
Mikl___
Автор FAQ
11379 / 5922 / 535
Регистрация: 11.11.2010
Сообщений: 10,938
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
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
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
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
31.10.2011, 16:13 #11
аттачи забыл...
2
Вложения
Тип файла: zip INUSE.ZIP (19.8 Кб, 168 просмотров)
Тип файла: zip EGA_CPI.ZIP (9.8 Кб, 46 просмотров)
Mikl___
Автор FAQ
11379 / 5922 / 535
Регистрация: 11.11.2010
Сообщений: 10,938
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
11379 / 5922 / 535
Регистрация: 11.11.2010
Сообщений: 10,938
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
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
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
-1 / 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
1997 / 1269 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
12.03.2012, 14:32 #16
Цитата Сообщение от Typoii Посмотреть сообщение
самая лучшая реализация
ага - макросом, так любой код в одну строку можно уместить)
0
Charles Kludge
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
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
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
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
Absolution
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,779
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
11379 / 5922 / 535
Регистрация: 11.11.2010
Сообщений: 10,938
11.04.2012, 07:14 #20
IOAN, так придется показывать, как создать MessageBox на разных диалектах ассемблера, а их штук двадцать наберется. Лучше по MessageBox создать отдельную тему и я мог бы показать, как только на MASM создать MessageBox 10 способами
0
11.04.2012, 07:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2012, 07:14
Привет! Вот еще темы с решениями:

Составить программу вывода на экран слова "Привет"
1.Составить программу вывода на экран слова «Привет!». Желательно с...

Заменить в строке группу символов "123" на "!", результат вывести на экран
Помогите решить задачу. Ввести с клавиатуры строку. Заменить группу символов &quot;...

Написать программу на ассемблере, которая подсчитывает количество букв "а" в строке
Здравствуйте. Помогите пожалуйста написать программу на ассемблере, которая...

Вводят строку. Найти в ней все слова с буквой "Z" и переместить их в другую строку. Вывести новую строку
Недавно начал изучать этот язык. Было все не плохо, но тут учитель решил...


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

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

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