2015-11-02 3 views
-4
DATA segment 
    msg1 db 0dh, 0ah, "ENTER A CHOICE $"; 
    msg2 db 0dh, 0ah, "1.Addition $"; 
    msg3 db 0dh, 0ah, "2.Subtraction $"; 
    msg4 db 0dh, 0ah, "3.Exit $"; 
    msg5 db 0dh, 0ah, "Enter the first number $"; 
    msg6 db 0dh, 0ah, "Enter the second number $"; 
    msg7 db 0dh, 0ah, "Result $"; 
    msg8 db 0dh, 0ah, "Enter a valid input $"; 
    msg9 db 0dh, 0ah, "$"; 
    buffer Db ?; 
    ten dw 0010; 
    hun dw 0100; 
    tho dw 1000; 
    rem dw ?; 
DATA ends 

CODE segment 
assume CS:CODE,DS:DATA 
start: 

    him proc 
     MOV AX,DATA; 
     MOV DS,AX; 

     MOV DX, OFFSET msg1; 
     MOV AH, 09H; 
     INT 21h; 
     MOV DX, OFFSET msg2; 
     MOV AH, 09H; 
     INT 21h; 
     MOV DX, OFFSET msg3; 
     MOV AH, 09H; 
     INT 21h; 
     MOV DX, OFFSET msg4; 
     MOV AH, 09H; 
     INT 21h; 
     MOV DX, OFFSET msg9; 
     MOV AH, 09H; 
     INT 21h; 

     mov ah, 01h; 
     int 21h; 

     cmp al, 33h; 
     je ex; 
     cmp al, 31h; 
     je addfunc; 
     cmp al, 32h; 
     je subfunc; 
     cmp al, 33h; 
     jg errfunc 
     cmp al, 31h; 
     jl errfunc 

     proc read 
      mov ah,01 
      int 21h 
      sub al,48 
      mul ten 
      mov buffer,al  
      mov ah,01   
      int 21h 
      sub al,48 
      add buffer,al 
      ret     ;number in buffer 
     endp 

     errfunc proc 
      mov dx, offset msg8 
      mov ah, 09h 
      int 21h 
      call him 
     endp 

     ex proc 
      MOV AH,4CH 
      INT 21H 
     endp 

     addfunc proc 
      MOV DX, OFFSET msg5; 
      MOV AH, 09H; 
      INT 21h; 
      call read 
      mov cl,buffer 
      MOV DX, OFFSET msg6; 
      MOV AH, 09H; 
      INT 21h; 
      call read 
      mov bl,buffer 
      MOV DX, OFFSET msg7; 
      MOV AH, 09H; 
      INT 21h; 
      add cl,bl; 
      mov al,cl 
      mov ah,00 
      call write 
      call him 
     endp 

     subfunc proc 
      MOV DX, OFFSET msg5; 
      MOV AH, 09H; 
      INT 21h; 
      call read 
      mov cl,buffer 
      MOV DX, OFFSET msg6; 
      MOV AH, 09H; 
      INT 21h; 
      call read 
      mov bl,buffer 
      MOV DX, OFFSET msg7; 
      MOV AH, 09H; 
      INT 21h; 
      sub cl,bl; 
      mov al,cl 
      mov ah,00 
      call write 
      call him 
     endp 

     proc write;assuming value is stored in ax 
      mov dx,0000 
      div tho 
      mov rem,dx 
      add al,48 
      mov dl,al 
      mov ah,02h 
      int 21h 

      mov ax,rem 
      mov dx,0000 
      div hun 
      mov rem,dx 
      add al,48 
      mov dl,al 
      mov ah,02h 
      int 21h 

      mov ax,rem 
      mov dx,0000 
      div ten 
      mov rem,dx 
      add al,48 
      mov dl,al 
      mov ah,02h 
      int 21h 

      mov ax,rem 
      mov dx,0000 
      add al,48 
      mov dl,al 
      mov ah,02h 
      int 21h 

      ret   
     endp 
    endp 

CODE ends 

end start 

ответ

1

MS-DOS необходимо два символа, чтобы выполнить переход курсора в начало следующей строки: 0dh (Carriage Return, сокр CR.) & 0ah (линия подачи, сокр LF.), Как правило, сокращенно CrLf. Первый символ заставляет курсор просто перейти к началу строки, второй символ позволяет курсору перейти к следующей строке. Вы можете играть с определениями (пропустите 0ah, опустите 0dh, опустите оба) и соблюдайте результат.

CrLf в начале msg1 не требуется для первого использования, но msg1 является частью цикла. result ... не имеет CrLf на своем конце, поэтому msg должен иметь его с самого начала.