Please someone help me adapt this code to POASM
/------------------------------------------------------------------/
TITLE salut1_exe
.MODEL SMALL
.STACK 100h
.DATA
mesaj DB "Salut!",13,10
lmesaj EQU $ mesaj
.CODE
start: mov ax,@data
mov ds,ax
mov bx,1
mov cx,lmesaj
mov dx,OFFSET mesaj
mov ah,40h
int 21h
mov ax,4C00h
int 21h
END start
Your code is 16-bit, that won't work with PoAsm. Here is an example that compiles fine but requires some libraries from Masm32: (http://masm32.com/)
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include \masm32\include\windows.inc ; main windows include file
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.code
AppTitle db "PoAsm is great:", 0
AppName db "Hi, I am a MessageBox", 0
start:
invoke MessageBox, 0, addr AppName, addr AppTitle, MB_OK
invoke ExitProcess, 0
end start
PoAsm (just like Pelle's C in general) is geared towards development for (32/64bit) Windows programming.
Your assembler code is for a 16bit .COM style DOS code, which PoAsm therefor doesn't understand...
Instead of using JJ's cryptic code to force a Windows executable with a different assembler, I think a better option to get you going with your x86 assembly language studies is to use JWasm (http://www.japheth.de/JWasm.html), which is likely to compile your source code just fine.
However, as this will (when linked) produce a 16bit .COM executable file, you can't run this on any 64bit flavor of Windows, as in those, the backwards compatibility that would enable you to run 16bit code has been removed. Any 32bit version of Windows however should be fine...
Ralf
For POAsm without any extra stuff:
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
MB_OK EQU 0h
MessageBoxA proto :DWORD, :DWORD, :DWORD, :DWORD
ExitProcess proto : DWORD
includelib kernel32.lib
includelib user32.lib
.code
AppTitle db "PoAsm is great:", 0
AppName db "Hi, I am a MessageBox", 0
start:
invoke MessageBoxA, 0, addr AppName, addr AppTitle, MB_OK
invoke ExitProcess, 0
end start
Quote from: Bitbeisser on February 05, 2014, 10:33:14 PMHowever, as this will (when linked) produce a 16bit .COM executable file..
Beisser, fyi this will produce a 16-bit
.exe, not .com
The example above was assembled with PoAsm, not with "a different assembler"; besides, I find your attempt to push the OP to continue with JWasm and 16-bit code utterly anachronistic.
@Timo: Thanks for simplifying the example.
Thanks a lot to all, i need to study more POASM structure. A very good example from "timovjl" <-- thanks. I would appreciate if someone wold give an example how to shoe "Hello" to console.
Sure, here it is:
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
includelib kernel32.lib
.code
TheMessage db "PoAsm is great:", 0
ConOut proc lpszText, sl
LOCAL bytesWritten
invoke GetStdHandle, -11 ; STD_OUTPUT_HANDLE
xchg eax, ecx
invoke WriteFile, ecx, lpszText, sl, addr bytesWritten, 0
ret
ConOut endp
start:
invoke ConOut, addr TheMessage, sizeof TheMessage
invoke ExitProcess, 0
end start
Simpler minimal version:
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
includelib kernel32.lib
ExitProcess proto : DWORD
GetStdHandle PROTO :DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
.data
msg db "PoAsm is great!",13,10,0
numw dd 0
.code
start:
invoke GetStdHandle, -11
invoke WriteFile, eax, addr msg, sizeof msg, addr numw, 0
invoke ExitProcess, 0
end start
When using debugger this one using PROC and ENDP works better:.486 ; create 32 bit code
.MODEL FLAT, STDCALL ; 32 bit memory model
OPTION CASEMAP :NONE ; case sensitive
INCLUDELIB kernel32.lib
ExitProcess PROTO :DWORD
GetStdHandle PROTO :DWORD
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
.data
msg db "PoAsm is great!",13,10,0
numw dd 0
.code
start PROC
INVOKE GetStdHandle, -11
INVOKE WriteFile, eax, ADDR msg, SIZEOF msg, ADDR numw, 0
INVOKE ExitProcess, 0
start ENDP
END start
Quote from: jj2007 on February 05, 2014, 10:59:20 PM
... besides, I find your attempt to push the OP to continue with JWasm and 16-bit code utterly anachronistic.
Given that he states in his (her?) subject that (s)he is a beginner, without any indication of what his/her problem is (s)he ran into and what the purpose for trying to get this exact example, which is clearly 16bit DOS based code (hence INT21h calls), I think that referring to a cleaner, DOS based assembler is rather appropriate than anachronistic.
Understanding how x86 assembler works is one thing, understanding what is required to get this working in Windows is a completely different ball game.
Basics never change, environments do...
Ralf
Quote from: Bitbeisser on February 05, 2014, 11:34:42 PMwithout any indication of what his/her problem is
Quote from: zellJunior on February 05, 2014, 09:17:49 PM
Please someone help me adapt this code to POASM
This is what Timo and I have done. Re environments, for console apps the switch from DOS to Win32 is not a big issue.
Ok. i analyzed this code, i see that we declare 3 procedures : GetStdHandle,..., and then we call them in "main" procedure with invoke. But i am a little confused. When i debug a C code, i see there a lot of "ADD","MOV","SUB"...<-- mnemonics.they miss from this code. I also know, assembler works with registers: ax,bx,cx,dx,eax,ebx,...
so : mov ax,10 ;means we move 10 to ax register.
my question is - what does the : (invoke GetStdHandle, -11) function. I changed -11 with other number and there is nothing shown.
Reading anachronistic's reply carefully, i think i cannot program in POASM for embeded systems.
Quote from: jj2007 on February 05, 2014, 11:48:38 PM
Quote from: Bitbeisser on February 05, 2014, 11:34:42 PMwithout any indication of what his/her problem is
Quote from: zellJunior on February 05, 2014, 09:17:49 PM
Please someone help me adapt this code to POASM
This is what Timo and I have done. Re environments, for console apps the switch from DOS to Win32 is not a big issue.
You missed that he clearly stated to be a beginner, and the source code he posted is a 16 bit DOS equivalent of a Hello World in x86 assembler.
The fact that he is/was trying to adapt this to PoASM is rather due to the effect that this is what he has at hand as a tool (as included in Pelle's C). And as stated by me, PoASM and 16 bit code simply don't mix.
You in fact did more then just adapting his program to PoASM, you rather adapted a 16bit DOS program to a 32bit Windows console application. And in his latest reply, he clearly states that he is even more confused by your adaptation...
"If someone's only tool he knows to use is a hammer, everything looks like a nail"...
Ralf
Quote from: zellJunior on February 06, 2014, 08:37:26 AM
Ok. i analyzed this code, i see that we declare 3 procedures : GetStdHandle,..., and then we call them in "main" procedure with invoke. But i am a little confused. When i debug a C code, i see there a lot of "ADD","MOV","SUB"...<-- mnemonics.they miss from this code. I also know, assembler works with registers: ax,bx,cx,dx,eax,ebx,...
so : mov ax,10 ;means we move 10 to ax register.
my question is - what does the : (invoke GetStdHandle, -11) function. I changed -11 with other number and there is nothing shown.
That's what I referred to in my latest reply to JJ, they not only adapted the code to to PoASM, they made a Windows program out of it.
They pretty much replaced to the direct screen output via INT21h of your initial (DOS) code posted with the more (much) complicated way of processing screen output via Windows handles, in effect changing your running environment, which for a beginner (as you called yourself) is indeed much more confusing....
QuoteReading anachronistic's reply carefully, i think i cannot program in POASM for embeded systems.
If you referring to my post (my name is Ralf, as you can see as I sign each and every post of mine (with some rare exceptions) with my real (first) name), then that is indeed what I was getting at.
You are presenting a DOS based program, using very specific DOS based services (INT21h is the DOS service interrupt) that simply do not exist/aren't allowed anymore in real Windows programs (as mentioned your program, when compiled and linked as true 16bit code won't run on any of the 64bit Windows versions anymore).
And PoASM (together with the rest of the Pelle's C programming environment) are specifically geared to create Windows programs. That is why I still think that it is the best option if you are using a tool (like JWAsm) that is more adapt to your task...
PoIDE works very nicely as an editor with syntax highlighting for any kind of x86 assembler code (that is actually one of the purposes I am using it myself for), but if you want to create plain DOS (or embedded as you eluded to) programs, you a tool specifically suited for that task.
Ralf
:) Well, I specifically develop for the DOS environment using Borland Turbo C and Borland Turbo Assembler. Both are DOS based however the Assembler has a version which also compiles for 32-bit mode in Windows. Since I have specialized using the 8086 chip which is DOS, I can give an example of an assembly using my tool. I hope it works for you. Sorry if I am kind of late, and a permanent friendly hello to everyone.
p8086
model small
dataseg
udataseg
stack 100h
codeseg
startupcode
mov dl, 'U'
mov ah, 2
int 21h
mov ah, 04ch
mov al, 0
int 21h
end
Okay this only prints out the word 'U' as in You. However it illustrates the use of interrupts which is the main cooking ingredientes for DOS assembly programming. hehe
:) I am a dork. I just noticed the original poster wanted to adapt a Borland Turbo Assembler program to a version by Pelles. I do not know Pelles, however, I can tell you what the program does so anyone who wants to help can adapt it. The program simply states "Salut!" then it goes to the next line with a line feed character. After that it tabs over and exit.
Cheers!