Ayuda con el ejercicio T_T

Iniciado por JorGe[xD], 18 Septiembre 2009, 19:23 PM

0 Miembros y 1 Visitante están viendo este tema.

JorGe[xD]

Hola como estan .

Mi pequeño gran problema es ...

Que cuando compilo en RadASM ... me sale error

Ejerc2IV.asm(32) : error A2033: invalid INVOKE argument : 2
Ejerc2IV.asm(32) : error A2114: INVOKE argument type mismatch : argument : 2

Quisiera saber como solucionarlo ... o que me dean una pista  :xD una explicacion

Lo que quiero hacer es :

Crear una calculadora  que sume  2 cantidades, debe tener  3 campo edit
donde:

El primer y segundo campo edit.-   se ingresara los  valores que se va a sumar.
El tercer campo edit.- mostrara el resultado.

Ademá s debe tener 3 botones con las siguientes funciones:

El primer botón.- Debe hacer la suma.
El segundo botón.-  Debe borrar todo los campos edit.
El tercer botón.- cerrar la ventana.

Para desarrollar este programa es necesario usar lo siguiente:

1.- la funciones atodw y dwtoa descritas en el capitulo III.
2.- Debes usar la instrucción add (suma).

Se pide el resultado en decimales, la idea es algo parecido a esta:



Archivo Ejercicio2VI.ASM :

Citar.386
.model flat, stdcall  ;32 bit memory model
option casemap :none ;case sensitive

include Ejerc2IV.inc

.code

start:

  invoke GetModuleHandle,NULL
  mov      hInstance,eax

  invoke InitCommonControls
  invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
  invoke ExitProcess,0


DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

  mov      eax,uMsg
  .if  eax==WM_INITDIALOG
 
  .elseif  eax==WM_COMMAND

  mov edx,wParam
  .if  eax==Boton01 ; aqui comparo si e presionado el Boton01 que seria Sumar
;si es asi ... realiza la siguiente funcion

     
    mov ebx,Edit01
   mov eax,Edit02
   add ebx,eax
     invoke  dwtoa,ebx,addr Edit03 ; aqui dice que esta el error ...


  .elseif  edx==Boton02 ; este seria el boton de Limpiar pero no se como se hace


  .elseif  edx==Boton03 ; el boton Salir
  invoke  SendMessage,hWin,WM_CLOSE,0,0
  .endif

  .elseif  eax==WM_CLOSE
      invoke  EndDialog,hWin,0
   .else
     mov      eax,FALSE
     ret
   .endif
  mov      eax,TRUE
 ret

DlgProc endp

end start

Archivo Ejercicio2VI.inc :
Citar
include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.inc
include masm32.inc
include rvlcnrand.Inc

includelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.lib
includelib masm32.lib
includelib rvlcnrand.lib

DlgProc         PROTO   :HWND,:UINT,:WPARAM,:LPARAM

.const



IDD_DIALOG1    equ     101
Edit01   equ       1001
Edit02   equ       1002
Edit03   equ         1003

Boton01     equ    1004
Boton02     equ    1005
Boton03     equ    1006

;#########################################################################
.data



.data?

buffer db 225 dup (?)
hInstance         dd ?

;#########################################################################


Desde ya Gracias :)

PD : Estoy estudiando los manuales de RadASM + MASM ... Ejercicio 2 del Capitulo VI.


Eternal Idol

Edit03 es un ID (un numero), no podes usar addr con el. Si lo que queres es obtener el valor de esos Edits podes usar GetDlgItemText (ahora ebx cuando llamas a dwtoa siempre es 1001 + 1002 = 2003).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

AleX Inc.

Intenta cambiando estos valores:
  .if  eax==Boton01
       
     mov ebx,Edit01
    mov eax,Edit02
    add ebx,eax
      invoke  dwtoa,ebx,addr Edit03

Por este:
.if  edx==Boton01
mov ebx,Edit01
mov eax,Edit02
add ebx,eax
invoke  dwtoa,ebx,Edit03


Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

JorGe[xD]

Cita de: Eternal Idol en 18 Septiembre 2009, 21:48 PM
Edit03 es un ID (un numero), no podes usar addr con el. Si lo que queres es obtener el valor de esos Edits podes usar GetDlgItemText (ahora ebx cuando llamas a dwtoa siempre es 1001 + 1002 = 2003).

pero GetdlgItemtext no es para cadenas de texto ?

osea 1001 + 1002 = 10011002

:S

Me confundo mas :xD

YST



Yo le enseñe a Kayser a usar objetos en ASM

Eternal Idol

Si, pero siempre es mejor que usar el ID del control y despues sacar el numero :D Tambien podes usar la funcion que menciono YST que hace eso mismo internamente pero si usas dwtoa supongo que no es el objetivo (tambien podrias usar SetDlgItemInt y no dwtoa en ese caso ...).

Tenes que obtener los dos primeros numeros y sumarlos, el valor de Edit03 lo tenes que poner vos de acuerdo al resultado de la suma y para eso vas a tener que usar un buffer (donde escribe dwtoa) y SetDlgItemText.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

JorGe[xD]

#7
Bueno es que me confundi mucho :S

por que si lees en una parte dice :
Citar
Para desarrollar este programa es necesario usar lo siguiente:

1.- la funciones atodw y dwtoa descritas en el capitulo III.
2.- Debes usar la instrucción add (suma).

Asi que no consideraba mas funciones ... :S ...

PD : YST ... firefox no me deja entrar a Paginas de Microsoft :S :S :S ...

Gracias a los dos

EDIT : Probe con Opera , IE  y pasa lo mismo .. me tira error al visitar cualquier pagina raiz  de Microsoft

AleX Inc.

Mmm.
Talvez podrias crear una funcion llamada "Suma", creo que describen en esos tutoriales como hacerla con ejemplo de una resta pero no estoy seguro.
Creo que son asi pero no estoy seguro:
Suma proc cantidad1:DWORD,cantidad2:DWORD
mov eax,cantidad1
add eax,cantidad2

.inc
Suma PROTO :DWORD,:DWORD
Y por ultimo seria cambiar estas funciones:
mov edx,wParam
.if  edx==Boton01
invoke Suma,Edit01,Edit02 ;esta es la funcion que creamos, aqui se supone que realiza la suma de ambas cantidades
invoke dwtoa eax,Edit03 ;Creo que asi debes mostrar el resultado (Inseguro)

Y esto lo podrias cambiar ya que talvez cause error en el programa:
.elseif  edx==Boton03 ; el boton Salir
   invoke  SendMessage,hWin,WM_CLOSE,0,0

Por este codigo:

.elseif  edx==Boton03 ; el boton Salir
invoke EndDialog,hWin,0

Estoy algo confundido por la escuela que no estoy seguro sobre como crear la funcion "Suma" pero puedes revisar el capitulo mencionado (creo que el 2) y por favor alguien de los buenos en ASM pueda corregirme a mi tambien ya que soy nuevo en ASM. :D

Eternal Idol

Cita de: JorGexD] link=topic=267886.msg1313102#msg1313102 date=1253574596]Asi que no consideraba mas funciones ... :S ...

A la fuerza vas a tener que usar alguna mas, de alguna manera tenes que obtener el numero (si es que lo es je) que el usuario escribe en el Edit.

AleX Inc. : es lo mismo de antes pero en una funcion, la clave es que no hay que usar los identificadores (valores constantes) sino lo que el usuario haya escrito.

La cosa vendria a ser algo asi (depuralo que no tengo el Ejerc2IV.inc ni muchas ganas tampoco):

Código (asm) [Seleccionar]
invoke GetDlgItemInt, hWin, Edit01, 0, 0
mov ebx, eax
invoke GetDlgItemInt, hWin, Edit02, 0, 0
add eax, ebx
;ahi tenes la suma correcta en eax
invoke dwtoa, ebx, buffer


PD. Al final ahora me doy cuenta de que ya tenes un buffer declarado en la sección de datos  ;D
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón