• Viernes 8 de Noviembre de 2024, 19:05

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Karin2009

Páginas: [1]
1
ASM (Ensamblador) / como puedo leer correctamente las entradas?
« en: Miércoles 29 de Abril de 2009, 13:31 »
Hola, estoy trabajando con nasm, y me ha surgido un error en un programa que estoy haciendo que usa las funciones externas de C printf y scanf. El programa en ensamblador solicita un numero real, lo lee y lo vuelve a imprimir en pantalla con sus respectivos mensajes. El programa que tengo es este:

Código: ASM
  1.  
  2. %include "asm_io.inc"
  3.  
  4. segment .data
  5.     prompt1  db "Ingrese valor : ",0
  6.     prompt2  db "%f",0
  7.         prompt3  db "El valor ingresado es %f",10,0
  8.  
  9. segment .bss
  10.     a  resw 1
  11.  
  12. segment .text
  13.         global pedir
  14.     extern printf, scanf
  15.  
  16.     pedir:
  17.             enter   0,0               ; setup routine
  18.             pusha
  19.    
  20.         ;printf(prompt1)
  21.         push prompt1
  22.         call printf
  23.         add esp,4
  24.    
  25.         ;scanf("%f",&a)
  26.         push a
  27.         push prompt2
  28.         call scanf
  29.         add esp,8
  30.        
  31.         fld dword[a]
  32.         push prompt3
  33.         call printf
  34.         add esp, 8
  35.    
  36.     salir:          
  37.         popa
  38.             mov     eax, 0            ; return back to C
  39.             leave                    
  40.             ret
  41.  
  42.  

Este programa es llamado por otro en C, compila bien y lo enlazo con el que lo llama usando gcc; pero cuando lo  ejecuto, aparce en la pantalla algo como esto:

Ingrese valor:123
El valor ingresado es -0.000000

El valor q ingreso es 123 y me devuelve ese otro valor, agradeceria si alguien me dice en q me estoy equivocando para corregirlo
Muchas gracias

2
C/C++ / como llamar a un programa ensamblador?
« en: Martes 28 de Abril de 2009, 16:25 »
Hola, estoy trabajando con nasm. Me piden q haga un programa en ensambaldor que me pida un valor, lo lea, y lo vuelva a imprimir con sus respectivos mensajes, utilizando las funciones de C printf y scanf. El programa en ensamblador q he hecho es este:
Código: ASM
  1.  
  2. %include "asm_io.inc"
  3.  
  4. segment .data
  5.     prompt1  db "Ingrese valor : "
  6.     prompt2  db "%f",0
  7.         prompt3  db "El valor ingresado es %f",10,0
  8.  
  9. segment .bss
  10.     a  resd 1
  11.  
  12. segment .text
  13.         global pedir
  14.     extern printf, scanf
  15.  
  16.     pedir:
  17.             enter   0,0               ; setup routine
  18.             pusha
  19.    
  20.         ;printf(prompt1)
  21.         push prompt1
  22.         call printf
  23.         add esp,4
  24.    
  25.         ;scanf("%f",&a)
  26.         push a
  27.         push prompt4
  28.         call scanf
  29.         add esp,8
  30.        
  31.         push dword[a]
  32.         push prompt6
  33.         call printf
  34.         add esp, 8
  35.    
  36.     salir:          
  37.         popa
  38.             mov     eax, 0            ; return back to C
  39.             leave                    
  40.             ret
  41.  
  42.  

Lo que no se es como llamarlo desde un programa en C, no necesita que le pase parametros, solo llamarlo. Agradeceria mucho su ayuda

3
ASM (Ensamblador) / call despues de un cmp?
« en: Jueves 12 de Marzo de 2009, 20:01 »
Hola, muchas gracias a todos por su ayuda, tyengo una duda, veo en los manuales

por ejemplo: una comparacion
  cmp eax, ebx
  jb salida  ; si eax es menor que ebx salta  a salida


pero, se puede hacer?

cmp eax, ebx
jb (call rutina)

o sea si eax es menor que ebx llamar a una rutina?

4
ASM (Ensamblador) / Re: no se como hacerlo
« en: Miércoles 11 de Marzo de 2009, 18:02 »
Hola, yo realmente necesito ayuda en esto
Código: ASM
  1.  
  2. ; Progama que solicita por pantalla 2 numeros enteros, los divide entre si y muestra el cociente y el resto
  3.  
  4. segment .data
  5.  
  6.     ; mensajes que se mostraran en pantalla para solicitar o mostrar datos
  7.  
  8.     mensaje1 db 'Ingresa dividendo : '
  9.     lon_mensaje1 equ $ - mensaje1
  10.  
  11.     mensaje2 db 'Ingresa divisor : '
  12.     lon_mensaje2 equ $ - mensaje2
  13.  
  14.     mensaje3 db 'El cociente es: '
  15.     lon_mensaje3 equ $ - mensaje3
  16.  
  17.     mensaje4 db 'y el resto es: '
  18.     lon_mensaje4 equ $ - mensaje4
  19.  
  20.     ; macro para convertir los caracteres a numeros enteros
  21.  
  22.     %define BASE 10
  23.  
  24. segment .bss
  25.  
  26.     ; datos ingresados por pantalla como cadena de caracteres
  27.  
  28.     dividendostr resb 10
  29.     lon_dividendo equ $ - dividendo
  30.  
  31.     divisorstr resb 10
  32.     lon_divisor equ $ - divisor 
  33.  
  34.     ; datos que mostrara por pantalla como cadena de caracteres
  35.  
  36.     cocientestr resb 10
  37.     lon_cociente equ $ - cociente
  38.  
  39.     restostr resb 10
  40.     lon_resto equ $ - resto
  41.  
  42.     ; datos en enteros, se reserva para cada uno de ellos el lugar para una doble palabra
  43.  
  44.     restonum resd 1
  45.    
  46.     dividendonum resd 1
  47.  
  48.     divisornum resd 1
  49.  
  50.     cocientenum resd 1
  51.  
  52. segment .text
  53.  
  54.     global _start
  55.  
  56.     _start
  57.  
  58.     ; solicita por pantalla el dividendo
  59.  
  60.     Mov eax, 4
  61.     Mov ebx, 1
  62.     Mov ecx, mensaje1
  63.     Mov edx, lon_mensaje1
  64.     Int 80h
  65.  
  66.     ; lee el dato ingresado y lo guarda en dividendostr
  67.  
  68.     Mov eax, 3
  69.     Mov ebx, 0
  70.     Mov ecx, dividendostr
  71.     Mov edx, 10
  72.     Int 80h
  73.  
  74.     ; solicita por pantalla el divisor
  75.  
  76.     Mov eax, 4
  77.     Mov ebx, 1
  78.     Mov ecx, mensaje2
  79.     Mov edx, lon_mensaje2
  80.     Int 80h
  81.  
  82.     ; lee el dato ingresado y lo guarda en divisorstr
  83.  
  84.     Mov eax, 3
  85.     Mov ebx, 0
  86.     Mov ecx, divisor
  87.     Mov edx, 10
  88.     Int 80h
  89.  
  90.     ; muestra por pantalla el cociente como cadena de caracteres
  91.  
  92.     Mov eax, 4
  93.     Mov ebx, 1
  94.     Mov ecx, mensaje3
  95.     Mov edx, lon_mensaje3
  96.     Int 80h
  97.  
  98.     Mov eax, 4
  99.     Mov ebx, 1
  100.     Mov ecx, cocientestr
  101.     Mov edx, lon_cociente
  102.     Int 80h
  103.  
  104.     ; muestra por pantalla el resto como cadena de caracteres
  105.  
  106.     Mov eax, 4
  107.     Mov ebx, 1
  108.     Mov ecx, mensaje4
  109.     Mov edx, lon_mensaje4
  110.     Int 80h
  111.  
  112.     Mov eax, 4
  113.     Mov ebx, 1
  114.     Mov ecx, restostr
  115.     Mov edx, lon_resto
  116.     Int 80h
  117.  
  118.     ; salida del programa
  119.  
  120.     Mov eax, 1
  121.     Mov ebx, 0
  122.     Int 80h
  123.  
  124.  


entre medias me falta : si las cadenas contienen caracteres no validos o el divisor es 0, saltar a la salida del programa.
convertir las cadenas a numeros y dividirlas como enteros sin signo, para luego hacer un estudio de los signos para ver si el cociente es negativo o positivo. y los resultados pasarlos a cadenas para mostrarlos por pantalla.
Agradeceria su ayuda

5
ASM (Ensamblador) / no se como hacerlo
« en: Martes 10 de Marzo de 2009, 17:41 »
Hola, hace unos dias q empece a estudiar lenguaje ensamblador para una clase,  estoy usando el nasm para IA-32, y me han pedido que convierta un numero ingresado por pantalla a entero, que lo lee como cadena de caracteres, pero se debe detectar si es negativo, o si tiene caracteres que no sean validos, y no tengo idea de como hacerlo. El numero debe ser de cualquier longitud. Agradeceria su ayuda

Páginas: [1]