Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > В асме 1-ый раз , что не так с выводом


Автор: DigitSphinx 5.6.2007, 02:18
Пробовал несколько способов , например этот 
Код

.386
.model flat, stdcall
option casemap : none
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib
wsprintfA PROTO C :DWORD,:VARARG
wsprintf equ <wsprintfA>
.data
Buff db 10 dup(0)
String db "EAX = %u",0
.code
START:  
mov eax, 10
invoke wsprintf,addr Buff,addr String,eax
invoke ExitProcess,0
end START

Компилятор masm32
Ollydbg выдает это
Код

MOV EAX,0A
PUSH EAX                                 ; /<%u> => A (10.)
PUSH sam.0040300A                        ; |Format = "EAX = %u"
PUSH sam.00403000                        ; |s = sam.00403000
CALL <JMP.&user32.wsprintfA>             ; \wsprintfA
ADD ESP,0C
PUSH 0                                   ; /ExitCode = 0
CALL <JMP.&kernel32.ExitProcess>         ; \ExitProcess
INT3


Автор: dumb 5.6.2007, 02:32
так ты только в буфер поместил строку. ее ж нужно вывести еще...
Код

Title db "title",0
...
invoke wsprintf,addr Buff,addr String,eax
invoke MessageBox, 0, addr Buf, addr Title, MB_OK
invoke ExitProcess,0
...


eax в параметрах invoke надо аккуратно ставить, так как он(eax) в некоторых случаях неявно используется самим invoke'ом.

Автор: DigitSphinx 5.6.2007, 03:49
Да сорри что то сглупил !, я перепутал с printf(…);
Я хочу вывести на консоль во !
Пример из книги (Александра крупника) 

Код

.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", 13, 10
h dd ?
cWritten dd ?
.code
START:  
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov h, eax
invoke WriteConsoleA, h, addr msg, 
        sizeof msg, addr cWritten, NULL
invoke ExitProcess,0
end START

При дебаге в Ollydbg после WriteConsoleA Ошибка такая ERROR_INVALID_HANDLE (00000006)
P.S. в предыдущем примере: в заголовке MessageBox’а было “TitleEAX = %u” этого я тоже не понял !

Автор: DigitSphinx 5.6.2007, 04:24
Опять сорри , линковал с параметром /SUBSYSTEM:WINDOWS
dumb, Спасибо большое.
Тема закрыта.


Автор: DigitSphinx 5.6.2007, 13:14
Вот еще вопрос
Есть такой пример из (Emu8086v.257)
Код

; Hello World
; Standard header:
    #make_COM#
        ORG  100H  
; Jump to start:
    JMP START
; Data:
msg DB 'Hello, World!', 13, 10
    DB 'My First Message without WINDOWS.', 13, 10
    DB 'Thank you!', '$'
; Load address of msg to DX register:
START:  LEA DX, msg
; Print using DOS interrupt:
        MOV AH, 9
        INT 21h
; Exit to operating system:
        MOV AH, 4Ch
        INT 21h

Я пытаюсь откомпилировать в *.com на masm32 так:
Код

\masm32\bin\ml /c console.asm
\masm32\bin\Link console.obj,,NUL,,,
exe2bin console.exe console.com

Параметры http://www.wasm.ru/forum/viewtopic.php?id=10993
masm32 очень сердито ругается 
Код

Assembling: console.asm
console.asm(4) : error A2044: invalid character in file
console.asm(5) : error A2034: must be in segment block
console.asm(8) : error A2034: must be in segment block
console.asm(11) : error A2034: must be in segment block
console.asm(12) : error A2034: must be in segment block
console.asm(13) : error A2034: must be in segment block
console.asm(17) : error A2034: must be in segment block
console.asm(20) : error A2034: must be in segment block
console.asm(21) : error A2034: must be in segment block
console.asm(24) : error A2034: must be in segment block
console.asm(25) : error A2034: must be in segment block
console.asm(25) : error A2088: END directive required at end of file

D:\masm32\MyWorks\dos>\masm32\bin\Link console.obj,,NUL,,,
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LINK : fatal error LNK1181: cannot open input file "console.obj,,NUL,,,"

Что не так


Автор: klyxa 5.6.2007, 15:25
в фасм
Код

org 100h

mov ah,09h
mov dx, sometext
int 21h

mov ah,10h
int 16h

sometext db "privet kamrad",24h


В масм хз=)

Автор: dumb 5.6.2007, 15:28
Цитата(DigitSphinx @  5.6.2007,  03:49 Найти цитируемый пост)
в предыдущем примере: в заголовке MessageBox’а было “TitleEAX = %u” этого я тоже не понял !

Код

Title db "Title" ; <-- ты тут 0 не поставил
String db "EAX = %u",0


Цитата(DigitSphinx @  5.6.2007,  13:14 Найти цитируемый пост)
Что не так

Цитата(DigitSphinx @  5.6.2007,  13:14 Найти цитируемый пост)
masm32 очень сердито ругается

для начала, это код для 16-битного режима(DOS), а ты его masm32 пытаешься компилить. откомпилить то он сможет, а вот собрать(link) - нет.

что касается исходника, то он должен выглядеть, например(есть разные варианты синтаксиса) так:
Код

    .model tiny
    .386
    .code

    ORG  100H  
; Jump to start:
start:
    JMP begin
; Data:
msg DB 'Hello, World!', 13, 10
    DB 'My First Message without WINDOWS.', 13, 10
    DB 'Thank you!', '$'
; Load address of msg to DX register:
begin:  LEA DX, msg
; Print using DOS interrupt:
        MOV AH, 9
        INT 21h
; Exit to operating system:
        MOV AH, 4Ch
        INT 21h

end start

Автор: DigitSphinx 5.6.2007, 16:34
Линковщик я скачал спец. для 16-х приложений и все работает !
dumb, Спасибо огромное !

Автор: klyxa 5.6.2007, 21:10
DigitSphinx, дай плиз ссылку на линковщик

Автор: DigitSphinx 5.6.2007, 22:03
http://www.wasm.ru/forum/viewtopic.php?id=10993
http://download.microsoft.com/download/vc15/Update/1/WIN98/EN-US/Lnk563.exe

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)