nasm - 16 bit Assembly Program -


so i've started learning 16 bit assembly using nasm on windows machine. if got little program i've created asks user input , determines if input within range (0 9). if is, goes on see if value divisible three, if not it's supposed loop , ask user value. here's code:

org 0x100     bits 16 ;jump on data declarations     jmp main  input:     db 6     db 0 user: times 6 db '  '  cr_lf: db 0dh, 0ah, '$'  message: db 'please enter number select between 0 , 9:','$' errormsg: db '***', 0ah, 0dh, '$' finalmsg: db 'number divisible 3!', 0ah, 0dh, '$' finalerrormsg: db 'number not divisible 3!', 0ah, 0dh, '$'  outputbuffer: db '     ', '$'  ;clear screen , change colours clear_screen:     mov ax, 0600h     mov bh, 17h ;white on blue     mov cx, 00     mov dx, 184fh     int 10h     nop     ret  move_cursor:     mov ah, 02     mov bh, 00     mov dx, 0a00h     int 10h     ret  ;get user input get_chars:     mov ah, 01     int 21h     ret  ;display string display_string:     mov ah, 09     int 21h     ret  errstar:     mov dx, errormsg         call display_string     int 21h     jmp loop1  nextphase:     cmp al, 30h     ;compare input '0' i.e. 30h     jl errstar      ;if input less 0, display error message     ;else     call thirdphase     ;input within range  thirdphase:     xor dx, dx      ;set dx 0 divide operation        ;at point al has value inputted user     mov bl, 3   ;give bl value     div bl      ;divide al bl, remainder stored in dx, whole stored in ax     cmp dx, 0   ;compare remainder 0     jg notequal ;jump not divisible 3 remainder greater 0     je end  notequal:     mov dx, finalerrormsg     call display_string     int 20h  end:     mov dx, finalmsg     call display_string     int 20h  ;main section main:     call clear_screen   ;clear screen     call move_cursor    ;set cursor  loop1:     mov dx, message     ;mov display prompt dx      call display_string ;display message     call get_chars      ;read in character     ;at point character value inputted user     cmp al, 39h     ;compare '9' i.e. 39h     jle nextphase       ;if value less or equal 9, move onto next phase     jg errstar      ;else call error , loop 

anyway, value range checking works fine , looping works fine too. problem i've got @ divisible in 3 thirdphase section. understanding firstly need make sure dx contains value of 0. move value 3 bl. al contains user input, bl contains value 3, , dx 0. during div bl part, al divided bl value of 3. remainder stored in dx , if compared 0 , found greater should jump notequal section else jump end section.

as now, finalmsg displayed, supposed displayed if value divisible 3.

anyone have suggestions. thanks. jp.

you doing div bl, dividing byte. quotient in al , remainder in ah, not in ax , dx, respectively, code assumes. make sure clear ah before div since dividend single byte in al.


Comments

Popular posts from this blog

c# - How Configure Devart dotConnect for SQLite Code First? -

c++ - Clear the memory after returning a vector in a function -

erlang - Saving a digraph to mnesia is hindered because of its side-effects -