Новичок
Профиль
Группа: Участник
Сообщений: 43
Регистрация: 9.5.2009
Репутация: нет Всего: нет
|
Я только начал учить асм. и передомной поставили задачу 1. написать програму для простого вивода числа, вот код.. Код | G SEGMENT PARA STACK "STACK" db 64 dup('stack') STSEG ENDS
DATA SEGMENT PARA PUBLIC "DATA" massage db "" massage1 db "Enter a number:$" massage2 db "Do you want to exit? y(yes)/n(not)$" massage3 db 10,13,"Characters that were entered: $" massage4 db 10,13,"A number is entered: $" massage_error3 db "You entered space!!!Please enter number without gap(space).",10,13,'$' massage_error2 db "You entered a too large number!!!",10,13,"The entered number must be in a range[-32767;32767].",10,13,'$' massage_error1 db "You entered character!!!",10,13,'$' TransitionLine db 13,10,'$';перехід каретки на нову стрічку SizeBuffer db 7;кількість символів blenth db ? bcontents db 7 dup(?) x dw 0 n dw 1 DATA ENDS
;===========================сегмент коду==================== CODE SEGMENT PARA PUBLIC "CODE" MAIN PROC FAR ASSUME CS: CODE, DS: DATA, SS: STSEG ;============================================================ mov ax,data mov ds,ax again1: call Clrscr begin1: call EnterData call Print call Exit
MAIN ENDP
;=========функція виводу повідомлення вводу======== EnterData : mov ah,9 lea dx,massage1 int 21h lea dx,SizeBuffer mov ah,0Ah int 21h lea dx,TransitionLine mov ah,09h int 21h ret ;=================================================== ;=========функція виходу============ Exit : mov ah,09h lea dx,TransitionLine int 21h mov ah,9 lea dx,massage2 int 21h exit2: mov ah,08h int 21h cmp al,'n' je again1 cmp al,'y' je exit1 cmp al,'n' jne exit2 exit1: mov ax,4C00h int 21h ret ;====================================
;==========очистка екрану============ Clrscr: mov ax,0003h int 10h ret ;====================================
;==========перетворення в число==================================== ConvertingNumberToHex: xor si,si xor ax,ax xor cx,cx mov cl,blenth mov di,cx label1: xor bx,bx mov bl,byte ptr bcontents[di-1] cmp bl,'-' jne per cmp di,1 je label8 call error1 per: cmp bl,'+' jne per1 cmp di,1 je label8 call error1 per1: cmp bl,' ' jne per2 call error3 per2: cmp bl,' ' jne label4 call error3 label8: ret label4: sub bl,'0';перевірка на символи cmp bl,9 jna label5 call error1 label5: cmp di,cx je label2 push ax ;записати число mov ax,bx mov bx, 10 mov cx,si label3: imul bx jno label6 ;перевірка переповнення call error2 label6: loop label3 mov bx,ax pop ax ;зчитати попередній результат label2:
add ax,bx ;додати попередній і теперишній результатит jno label7 call error2 label7: dec di inc si cmp di,0 jne label1 ret ;==================================================================
;====================помилка вводу(введено сивол)================== error1: mov ah,9 lea dx,massage_error1 int 21h jmp begin1 ret ;================================================================== ;====================помилка вводу(введено пробел)================== error3: mov ah,9 lea dx,massage_error3 int 21h jmp begin1 ret ;==================================================================
;====================помилка вводу(переновнення)================== error2: mov ah,9 lea dx,massage_error2 int 21h jmp begin1 ret ;==================================================================
;====================переводимо із 16 в 10ричну ситему============= ConvertingNumberToDec:
xor bx,bx mov bx,x or bx,bx; jns m1 mov al,'-' int 29h neg bx m1: mov ax,bx xor cx,cx mov bx,10 m2: xor dx,dx div bx add dl,'0' push dx inc cx test ax,ax jnz m2 m3: pop ax int 29h loop m3
ret ;==================================================================
;===================вивести відповідь на монітор=================== Print: call ConvertingNumberToHex mov x,ax xor bx,bx mov bl,byte ptr bcontents cmp bl,'-' ;перевырка на від'ємність числа jne j1 neg ax mov x,ax j1: mov ah,9h lea dx,massage4 int 21h call ConvertingNumberToDec
mov ah,09h;робимо отступ lea dx,TransitionLine int 21h ret ;==================================================================
CODE ENDS END MAIN
|
работает вроде нормально... а потом переделать этуже прогу с используванием макросов.. я чтото творил, ну есть ошыбка... помогите, кто может, переделать эту програму из используванием макросов вот код тот что я делал, может ктото подскажет как устранить ошибку Код | ;=макрос настройки ds на сегмент данных init_ds macro mov ax,data mov ds,ax xor ax,ax endm ;==================================== ;==========очистка екрану============ Clrscr macro mov ax,0003h int 10h endm ;==================================== ;==========вивід повідомлення======== out_str macro str mov ah,09h lea dx,str int 21h endm ;==================================== ;=========вихiд============ Exit macro mov ax,4C00h int 21h endm ;==================================== EnterData macro n lea dx,SizeBuffer mov ah,n int 21h endm ;=================================================== ;==============обнуляємо число====================== clear_r macro rg xor rg,rg endm ;=================================================== ;==============виводим al====================== print_al macro rg mov al,rg int 29h endm ;=================================================== ;====================переводимо із 16 в 10ричну ситему============= ConvertingNumberToDec macro
clear_r bx mov bx,x or bx,bx; jns m1 ;print_al mov al,'-' int 29h neg bx m1: mov ax,bx clear_r cx mov bx,10 m2: clear_r dx div bx add dl,'0' push dx inc cx test ax,ax jnz m2 m3: pop ax int 29h loop m3
endm ;================================================================== ;==================помтлка========================== error macro str mov ah,9 lea dx,str int 21h jmp begin1 endm ;===================================================
;==========перетворення в число==================================== ConvertingNumberToHex macro clear_r si clear_r ax clear_r cx mov cl,blenth mov di,cx label1: xor bx,bx mov bl,byte ptr bcontents[di-1] cmp bl,'-' jne per cmp di,1 je label8 error massage_error1
label7: dec di inc si cmp di,0 jne label1 jmp label8 per: cmp bl,'+' jne per1 cmp di,1 je label8 error massage_error1 per1: cmp bl,' ' jne per2 error massage_error3 per2: cmp bl,' ' jne label4 error massage_error3 label4: sub bl,'0';перевірка на символи cmp bl,9 jna label5 error massage_error1 label5: cmp di,cx je label2 push ax ;записати число mov ax,bx mov bx, 10 mov cx,si label3: imul bx jno label6 ;перевірка переповнення error massage_error2 label6: loop label3 mov bx,ax pop ax ;зчитати попередній результат label2: add ax,bx ;додати попередній і теперишній результатит jno label7 error massage_error2 label8: endm ;==================================================================
;===================вивести відповідь на монітор=================== Print macro ConvertingNumberToHex mov x,ax clear_r bx mov bl,byte ptr bcontents cmp bl,'-' ;перевырка на від'ємність числа jne j1 neg ax mov x,ax j1: out_str massage4 ConvertingNumberToDec
out_str TransitionLine endm ;================================================================== STSEG SEGMENT PARA STACK "STACK" db 64 dup('stack') STSEG ENDS
DATA SEGMENT PARA PUBLIC "DATA" massage db "" massage1 db "Enter a number:$" massage2 db "Do you want to exit? y(yes)/n(not)$" massage3 db 10,13,"Characters that were entered: $" massage4 db 10,13,"A number is entered: $" massage_error3 db "You entered space!!!Please enter number without gap(space).",10,13,'$' massage_error2 db "You entered a too large number!!!",10,13,"The entered number must be in a range[-32767;32767].",10,13,'$' massage_error1 db "You entered character!!!",10,13,'$' TransitionLine db 13,10,'$';перехід каретки на нову стрічку SizeBuffer db 7;кількість символів blenth db ? bcontents db 7 dup(?) x dw 0 n dw 1 DATA ENDS
;===========================сегмент коду==================== CODE SEGMENT PARA PUBLIC "CODE" MAIN PROC FAR ASSUME CS: CODE, DS: DATA, SS: STSEG ;============================================================ init_ds again2: Clrscr begin1: out_str massage1 EnterData 0Ah out_str TransitionLine Print again1: jmp again2 out_str TransitionLine out_str massage2 exit2: EnterData 08h cmp al,'n' je again1 cmp al,'y' je exit1 jmp exit2 exit1: Exit
MAIN ENDP CODE ENDS END MAIN
|
|