Helpful Information
 
 
Category: Other Programming Languages
I need help with assembly code

i want to load an image from the dos command line: like LSB.exe image.bmp
here is the program source files (HERE THE LOADING OF THE IMAGE IS DONE BY OPEN WINDOW)
please help me i need to do command line execution of the program....
the LSB.asm saves the result image but i want it displayed in a window


please help i dont know any thing about assembly..

the code is the following
callW macro x
extrn x:PROC
call x
endm

.486
.model flat


;-------------- Data of the Program --------------

.data

;----------------- structures --------------------

openfilename_struct:
lStructSize dd openfilename_struct_size
hwndOwner dd 0
hInstance dd 0
lpstrFilter dd offset filter
lpstrCustomFilter dd 0
nMaxCustFilter dd 0
nFilterIndex dd 0
lpstrFile dd offset namebuffer
nMaxFile dd 255
lpstrFileTitle dd 0
nMaxFileTitle dd 32
lpstrInitialDir dd 0
lpstrTitle dd 0
Flags dd 1000h+4h+200000h
nFileOffset dw 0
nFileExtension dw 0
lpstrDefExt dd 0
lCustData dd 0
lpfnHook dd 0
lpTemplateName dd 0
openfilename_struct_size equ $-offset openfilename_struct

;------------- file/memory Essentials --------------------

filter db "Bmp files *.bmp",0,"*.bmp",0,0
namebuffer db 255 dup(0)
result_title db "BMP2LSB", 0
no_bmp db "This is not a Bitmap Image",0

file_handle2 dd ?
file_size dd ?
file_handle dd ?
file_mem_buffer dd ?
file_nb_bytes_read dd ?
pixels_data_start dd ?



;-------------- Code of the Program --------------
.code

program:

;-------- choose a file -------------

push offset openfilename_struct
callW GetOpenFileNameA
test eax, eax
jz end

;-------- open it --------------

push 0
push 80h
push 3
push 0
push 0
push 80000000h+40000000h
push dword ptr [lpstrFile]
callW CreateFileA
inc eax
jz end
dec eax
mov file_handle, eax

;---------- get its size ---------

push 0
push dword ptr file_handle
callW GetFileSize
inc eax
jz close_file
dec eax
mov file_size, eax

;--------- alloc memory for file --------

mov eax, file_size
add eax, 1024
push eax
push 40h
callW LocalAlloc
test eax, eax
jz close_file
mov file_mem_buffer, eax

;------- read entire file ------------

push 0
push offset file_nb_bytes_read
push file_size
push file_mem_buffer
push file_handle
callW ReadFile
test eax, eax
jz free_memory
mov eax, file_nb_bytes_read
cmp eax, file_size
jnz free_memory

;-------- find BMP signature in header ---------

mov esi, file_mem_buffer
lodsw
cmp ax, "MB"
jne trouble

;------- find number of bits per pixel ------

add esi, 8
lodsd
add eax, file_mem_buffer
mov pixels_data_start, eax
add esi, 14
lodsw
cmp ax, 24
je this_looks_like_a_bmp

;-------- not 24-bits BMP -----------

trouble:
push 0
push offset result_title
push offset no_bmp
push 0
callW MessageBoxA
jmp free_memory

;------ Enhance LSBs -----------

this_looks_like_a_bmp:

mov eax, pixels_data_start
sub eax, file_mem_buffer
mov ecx, file_size
sub ecx, eax

mov esi, pixels_data_start
mov edi, esi

change_all:
lodsb ;get byte
and al, 1 ;eliminate everything except LSB
jz no_fill ;if 0, do nothing
mov al, 0ffh ;if 1, replace by 255
no_fill:
stosb ;put the byte back
loop change_all

;------- add _LSB to the name ----------------

mov esi, offset namebuffer
mov ecx, 255

find_extension:
mov al, [esi+ecx]
cmp al, "."
je modify_name
loop find_extension

modify_name:
mov eax, "BSL_"
mov [esi+ecx], eax
mov eax, "pmb."
mov [esi+ecx+4], eax

;------- open a new file on the disk ----------------

push 0
push 80h
push 2
push 0
push 0
push 40000000h
push offset namebuffer
call CreateFileA
mov file_handle2, eax

;------- write buffer in it ----------------

push 0
push offset file_nb_bytes_read
push file_size
push file_mem_buffer
push file_handle2
callW WriteFile

;------- close it ----------------

push file_handle2
callW CloseHandle
jmp free_memory

;------- close memory ----------------

free_memory:
push file_mem_buffer
callW LocalFree

;-------- close file ----------

close_file:
push dword ptr file_handle
callW CloseHandle

;----------- exit ----------

end:
push -1
callW ExitProcess

end program

WTF are you doing with all this code if you don't know bupkis about ASM? I suggest you pick up a book and learn the basics before you ask any questions. If this is really urgent, go look for whoever dumped you this job and tell the person you know 0% of ASM.

sorry but the coder email is not in use

this program is loading a 24-bit bitmap image and then extracts the LSB then it saves the result image in the same name of the loaded image with _LSB extention
the only thing i need is to load the image from the comand line like this LSB.exe image.bmp
and then displays the result image rather than saving it.

i need it badly because my project uses this command line feature...

sorry if i was annoying..
but if you can help me please do..
thanks

Sorry, I don't speak assembler, but this is the appropriate place to post such a question. Just ignore Jafet's sanctimonious proclamations. :)

generating a window... that could be difficult in asm.

Assemble it with DJGPP (yes, it will eat ASM code...)

call it and then display the image, all from within a batch file.

mvantuyl please give me the link

There wasn't meant to be a link :confused:

Is there a good reason that you want this done in assembler and not use a higher level language (say C++?) Note that the asm code is using a bunch of Windows API calls (GetFileNameA, CreateFileA etc.) and parsing the header from the file. You can easily write this in a high level language as well.










privacy (GDPR)