DkCd Posted December 18, 2008 Report Posted December 18, 2008 Ok, no se programar en ensamblador y tengo que hacer una tarea para mañana, aqui ta el enunciado Por medio del lenguaje ensamblador, desarrollar un programa que realice las operaciones matemáticas de suma y resta de dos números de un digito (entre 0 y 9). El programa debe ser amigable para el usuario a la hora de solicitar los números y de dar el resultado. Buscando por la interwabz codigos ejemplo me encontre esto org 100h jmp start; skip data. msg1 db 0Dh,0Ah, 'input numbers in this range: [-32768..32767]', 0Dh,0Ah db 0Dh,0Ah, 'enter first number: $' msg2 db 0Dh,0Ah, 'enter second number: $' msg3 db 0Dh,0Ah, 'the sum is: $' ; declaration of variable: num dw ? start: ; print first message mov dx, offset msg1 mov ah, 9 int 21h call scan_num ; keep first number: mov num, cx ; print second message mov dx, offset msg2 mov ah, 9 int 21h call scan_num ; add numbers: add num, cx jo overflow ; print the result: mov dx, offset msg3 mov ah, 9 int 21h mov ax, num call print_num jmp exit ; process overlow error: overflow: printn 'we have overflow!' exit: ; wait for any key press: mov ah, 0 int 16h ret; return control to operating system. Alguien conoce algo sobre esta cosa, halp :S
b52|Hunhau Posted December 18, 2008 Report Posted December 18, 2008 Nunca me intereso tanto irme a "tan bajo nivel", pero como sugerencia, asegurese que esta usando el ensamblador correcto.
vOv Posted December 18, 2008 Report Posted December 18, 2008 (edited) tengo que hacer una tarea para mañana si tiene tarea es xq está llevando el curso no, xq no sabe tons? En cualquier caso sea más especifico con su pregunta, no ha dicho en que parte ocupa ayuda y dificilmente alguien va a hacerle la tarea. P.D. agree con hunhau Edited December 18, 2008 by Báhdom
DkCd Posted December 18, 2008 Author Report Posted December 18, 2008 (edited) A mi tampoco me interesa, y no se NADA, el problema fue que el profe tuvo no se que problemas tuvo tons solo tuvimos una clase de ensamblador x eso nos dio esta tarea tan facilita para proyecto, lo que pasa es que como ya dije, no se nada :S Edited December 18, 2008 by DarkCloud
kamikaze Posted December 18, 2008 Report Posted December 18, 2008 pues hace muchol tiempo q lleve eso de ensamblador y ese codigo q puso solo suma .... pero me parece q se puede basar en ese y hacer las demas operaciones, fijo vas a necesitar muchos jumps LOL XD
b52|Hunhau Posted December 18, 2008 Report Posted December 18, 2008 http://www.laynetworks.com/assembly%20tutorials4.htm No recuerdo mucho del mentado ensamblador, pero creo que ahi puede comenzar. Por ahi veo un listado de interrupciones, entonces con eso se la puede jugar para la lectura/escritura. Suma y resta es saber las instrucciones y mover registros y esas varas que dan mucha pega.
vOv Posted December 18, 2008 Report Posted December 18, 2008 la vara con ese codigo es q usa macros que no sabemos si el mae tiene
DkCd Posted December 18, 2008 Author Report Posted December 18, 2008 Ok, luego de ver varios ejemplos consegui una calculadora y le modifique para que solo sumara y restara, pero veo que se ve como muy complicada para alguien que solo llevo una clase de esta vara... Deberia simplificarla mas?? name "Proyecto2" PUTC MACRO char PUSH AX MOV AL, char MOV AH, 0Eh INT 10h POP AX ENDM org 100h jmp start ; variables msg1 db 0Dh,0Ah, 'Digite el primer numero: $' msg2 db "Digite el simbolo correspondiente a la operacion deseada: + - : $" msg3 db "Digite el segundo numero: $" msg4 db 0dh,0ah , 'El resultado es : $' msg5 db 0dh,0ah ,'Presione la tecla "s" para salir : ', 0Dh,0Ah, '$' err1 db "Simbolo de operacion incorrecto!", 0Dh,0Ah , '$' opr db '?' num1 dw ? num2 dw ? start: ;mov dx, offset msg0 lea dx, msg1 mov ah, 09h int 21h call scan_num ; guarda el primer numero digitado mov num1, cx ;nueva linea creada putc 0Dh putc 0Ah lea dx, msg2 mov ah, 09h int 21h ;aqui se obtiene el operador mov ah, 1 ; entra un char al AL. int 21h mov opr, al ;nueva linea creada putc 0Dh putc 0Ah cmp opr, 's'; s para salida del programa je exit lea dx, msg3 mov ah, 09h int 21h call scan_num ; se guarda el segundo numero digitado mov num2, cx lea dx, msg4 mov ah, 09h int 21h ; calculate: cmp opr, '+' je do_plus cmp opr, '-' je do_minus wrong_opr: lea dx, err1 mov ah, 09h int 21h exit: lea dx, msg5 mov ah, 09h int 21h ;esperar a que una tecla sea presionada mov ah, 0 int 16h ret;retornar al OS do_plus: mov ax, num1 add ax, num2 call print_num ; imprime el valor de ax. jmp exit do_minus: mov ax, num1 sub ax, num2 call print_num ; imprime el valor de ax. jmp exit SCAN_NUM PROC NEAR PUSH DX PUSH AX PUSH SI MOV CX, 0 ; bandera en reset MOV CS:make_minus, 0 next_digit: ; obtiene un char del teclado ; into AL: MOV AH, 00h INT 16h ; y lo imprime: MOV AH, 0Eh INT 10h ; checkea el MINUS: CMP AL, '-' JE set_minus ; checkea el ENTER: CMP AL, 0Dh ; carriage return? JNE not_cr JMP stop_input not_cr: CMP AL, 8 ; pregunta si el 'BACKSPACE' fue presionado? JNE backspace_checked MOV DX, 0 ; removueva el ultimo digito MOV AX, CX ; division: ; DIV CS:ten ; MOV CX, AX PUTC ' ' ; clear position. PUTC 8 ; backspace de nuevo. JMP next_digit backspace_checked: ; allow only digits: CMP AL, '0' JAE ok_AE_0 JMP remove_not_digit ok_AE_0: CMP AL, '9' JBE ok_digit remove_not_digit: PUTC 8 ; backspace. PUTC ' ' PUTC 8 ; backspace again. JMP next_digit; espera por la siguiente entrada. ok_digit: ; multiplica CX por 10 (la primera vez el resultado es zero) PUSH AX MOV AX, CX MUL CS:ten ; DX:AX = AX*10 MOV CX, AX POP AX ; checkea si el numero es muy grande CMP DX, 0 JNE too_big ; convertir del codigo ASCII: SUB AL, 30h ; add AL to CX: MOV AH, 0 MOV DX, CX ADD CX, AX JC too_big2 JMP next_digit set_minus: MOV CS:make_minus, 1 JMP next_digit too_big2: MOV CX, DX MOV DX, 0 too_big: MOV AX, CX DIV CS:ten ; reverse last DX:AX = AX*10, make AX = DX:AX / 10 MOV CX, AX PUTC 8 ; backspace. PUTC ' ' PUTC 8 ; backspace again. JMP next_digit; esperar a que Enter/Backspace sean presionados. stop_input: ; checkear la bandera: CMP CS:make_minus, 0 JE not_minus NEG CX not_minus: POP SI POP AX POP DX RET make_minus DB ? ;usado como bandera. SCAN_NUM ENDP ;imprime el numero en AX ; usa PRINT_NUM_UNS para imprimir los numeros: PRINT_NUM PROC NEAR PUSH DX PUSH AX CMP AX, 0 JNZ not_zero PUTC '0' JMP printed not_zero: ; revisa el signo de AX ; make absolute if it's negative: CMP AX, 0 JNS positive NEG AX PUTC '-' positive: CALL PRINT_NUM_UNS printed: POP AX POP DX RET PRINT_NUM ENDP ; allowed values are from 0 to 65535 (FFFF) PRINT_NUM_UNS PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX ; la bandera para prevenir imprimir zeros antes del número: MOV CX, 1 ; (el resultado de "/ 10000" siempre es menor o igual que 9). MOV BX, 10000 ; 2710h - divider. ; AX is zero? CMP AX, 0 JZ print_zero begin_print: CMP BX,0 JZ end_print ; la bandera para prevenir imprimir zeros antes del número: CMP CX, 0 JE calc ; if AX<BX then result of DIV will be zero: CMP AX, BX JB skip calc: MOV CX, 0 ; set flag. MOV DX, 0 DIV BX ; AX = DX:AX / BX (DX=remainder). ; print last digit ; AH is always ZERO, so it's ignored ADD AL, 30h ; convert to ASCII code. PUTC AL MOV AX, DX ; get remainder from last div. skip: ; calculate BX=BX/10 PUSH AX MOV DX, 0 MOV AX, BX DIV CS:ten ; AX = DX:AX / 10 (DX=remainder). MOV BX, AX POP AX JMP begin_print print_zero: PUTC '0' end_print: POP DX POP CX POP BX POP AX RET PRINT_NUM_UNS ENDP ten DW 10 ; used as multiplier/divider by SCAN_NUM & PRINT_NUM_UNS. GET_STRING PROC NEAR PUSH AX PUSH CX PUSH DI PUSH DX MOV CX, 0 ; char counter. CMP DX, 1 ; buffer too small? JBE empty_buffer ; DEC DX ; reserve space for last zero. ;============================ ; loop infinito para obtener ; y procesar la tecla presionada: wait_for_key: MOV AH, 0 ; obtener tecla presionada. INT 16h CMP AL, 0Dh ; 'RETURN' JZ exit_GET_STRING CMP AL, 8 ; 'BACKSPACE' JNE add_to_buffer JCXZ wait_for_key ; nothing to remove! DEC CX DEC DI PUTC 8 ; backspace. PUTC ' ' ;limpiar posicion. PUTC 8 ; backspace. JMP wait_for_key add_to_buffer: CMP CX, DX ; buffer esta lleno? JAE wait_for_key ; if so wait for 'BACKSPACE' or 'RETURN'... MOV [DI], AL INC DI INC CX ; imprimir simbolo: MOV AH, 0Eh INT 10h JMP wait_for_key ;============================ exit_GET_STRING: ; terminate by null: MOV [DI], 0 empty_buffer: POP DX POP DI POP CX POP AX RET GET_STRING ENDP
vOv Posted December 18, 2008 Report Posted December 18, 2008 (edited) No lo leí todo pero creo que en general está muy grande/complicado para lo que tiene que hacer. Me pareció mejor el primero. P.D. Ya vi porqué era: el segundo código tiene más operaciones/funcionalidad. Use mejor el primero que hace sume/resta simple que es lo que ocupa. Edited December 18, 2008 by Báhdom
Tomjeep Posted December 18, 2008 Report Posted December 18, 2008 Lo que necesita es invocar a PAPA ABEL
djfrocho Posted December 18, 2008 Report Posted December 18, 2008 Casi me quedo Ciego con todas estas demostraciones de Maes Rajados en Programacion ... haganse un TEAM y dediquense a hacer cracks.... asi apoyan mas a lo comunidad .. lol
xG.SGT Posted December 18, 2008 Report Posted December 18, 2008 Mae darkcloud, El profe le da esas tareas para que usted investigue y APRENDA ensamblador, y entienda como funciona la vara, hay 2 motivos para esto, 1 que aprenda a buscar y aprender por usted mismo, y 2ndo que entienda ensamblador y no solo copy/paste y listo. Por algo usted se va a graduar como Ingeniero en Sistemas, INGENIERO es la palabra llave.
vOv Posted December 18, 2008 Report Posted December 18, 2008 (edited) "ingeniero" no al menos que esté llevando química, física, etc (por lo menos no según una entidad cuyo nombre no recuerdo) Edited December 18, 2008 by Báhdom
kLorD Posted December 18, 2008 Report Posted December 18, 2008 (edited) "ingeniero" no al menos que esté llevando química, física, etc (por lo menos no según una entidad cuyo nombre no recuerdo)ingeniero = ingenio = producir = generar Edited December 18, 2008 by DarKross
vOv Posted December 18, 2008 Report Posted December 18, 2008 (edited) en ese caso los panaderos también son ingenieros igual déjeme ver si encuentro la página esa, hasta entonces ignoren mi post =p Edited December 18, 2008 by Báhdom
kLorD Posted December 18, 2008 Report Posted December 18, 2008 en ese caso los panaderos también son ingenierosno todos, la mayoría usa recetas ya existentes........
b52|Hunhau Posted December 18, 2008 Report Posted December 18, 2008 inc discusion de quienes califican como ingenieros y quienes no. le sigh
b52|Hunhau Posted December 18, 2008 Report Posted December 18, 2008 El toque era postear algun ensamblador que escribiera alguna vara en el boot sector del disco.
DkCd Posted December 18, 2008 Author Report Posted December 18, 2008 ese codigo esta modificado no es un copy paste... y entiendo lo que hace cada pedazo x eso estan los comments, tons si aprendi emsamblador!!!!!!
vOv Posted December 18, 2008 Report Posted December 18, 2008 (edited) considerando que esta pegado en un sumador lo pondría en duda BTW, es eNsamblador Edited December 18, 2008 by Báhdom
Kand Posted December 18, 2008 Report Posted December 18, 2008 Este thread esta en el foro equivocado...
x[G]Achen23 Posted December 18, 2008 Report Posted December 18, 2008 Mae DarkCloud, en la descripción de su tarea dice desarrollar, y como parte de su aprendizaje debería de intentar hacerlo por cuenta propia y no bajar un código que le sirva o que otro se lo haga. Si hace todas las tareas así nunca va a aprender. Y si es cierto lo que dijo alguien en un post anterior. Use el libro de Peter Abel es muy bueno para dar inicio en conocimientos para desarrollar en lenguaje ensamblador.
Areku Posted December 18, 2008 Report Posted December 18, 2008 jajaja ya salio cagado! jaja pero bureno me imagino que al igual q mi a mucha gente le da media colera ver como mucha gente pretende salir de la U haciendo tareas de esta forma (co py paste de internet y quito cosas y cambio nombres).. yo diria que tome los comments aca por el lado bueno... si tiene una duda especifica hagala ahi me imagino q cualquiera le ayuda.. pero preguntar por toda una tarea.. bueeeno... de ahi de las respuestas... al final es ciertoo que nadie ocupa ensablador en la calle.. pero al final este tipo de lenguajes te ayudan mucho a desarrollar la mente y a abstraer mejor los problemas y las cosas... y pensar q en el tec dan casi que todo un curso de esto.. bueno no se si aun... pero fue vacilon.. (nosotros hicimos un compresor..
Recommended Posts