2013-04-24 4 views
0

Я пытаюсь скомпоновать код сборки с NASM ... В принципе, я застрял, меняя число, которое вводится в большее число, нарисованное знаками $. Так что программа, среди прочего, читает число от 1 до 9 и преобразует ее в числовое значение и отображает большой номер $. Я определил битовый шаблон для каждого номера для каждой строки, чтобы отобразить шаблон $ знаков, чтобы нарисовать число с. Все номера имеют размер 7 строк, и теперь мне нужно пройти через бит-шаблон, вот где я застрял. Вот моя программа.Программа сборки NASM

  bits 16 
      org  0x100 
      jmp  main ;Jump to main program 
message: db  'Please enter a number(1-9)',0ah,0dh,'$' 
enl_num1: db  06h,06h,06h,06h,06h,06h,06h ; enlarged 1 
enl_num2: db  04h,0Ah,11h,02h,04h,08h,1Fh ; enlarged 2 
enl_num3: db  0Eh,11h,06h,18h,06h,01h,1Eh ; enlarged 3 
enl_num4: db  01h,02h,04h,0Ah,1Fh,02h,02h ; enlarged 4 
enl_num5: db  1Fh,10h,1Ch,02h,01h,02h,1Ch ; enlarged 4 
enl_num6: db  01h,02h,04h,08h,14h,14h,08h ; enlarged 5 
enl_num7: db  1Fh,01h,02h,04h,08h,10h,10h ; enlarged 7 
enl_num8: db  04h,0Ah,0Ah,04h,0Ah,0Ah,04h ; enlarged 8 
enl_num9: db  0Eh,11h,11h,0Fh,01h,01h,1Fh ; enlarged 9 
error_mess: db  '**','$' 
output_0: db  ' ' 
output_d: db  '$'  

str_to_num: 
      xor  bh,bh ;bh = 0 
      cmp  al,39h ;ASCII for 9 
      jg  str_to_num_error ; > 9 is invalid 
      sub  bl,30h ;convert to numeric 
      jl  str_to_num_error ; < 0 also invalid 
      mov  bh,1h ;succesful completion 
str_to_num_error: 
      ret    ;return 
error:  
      mov  dx,error_mess ;adding ** to number that is not 1-9 
      mov  ah,09   ;to display string 
      int  21h   ;DOS interrupt 
      jmp  message 
      ret     ;return 

print_num: 
      mov  cx,8 ; cx=8 loop counter 
      mov  al,[si] ;move one byte into al 
      push ax  ;push onto stack 
      inc  si  ;point to next byte 
      cmp  dh,0 ;test for 0 
      jne  not_0 
      je  is_0 
      loop print_num ;decrement cx, repeat loop if cx <>0 
      db  ' ',0ah,0dh,'$' 
      mov  ah,09 ;to display string 
      int  21h  ;DOS interrupt 

      ret 
not_0:  mov  dx,output_d ;address of output 
      mov  ah,09  ;service - display message 
      int  21h   ;DOS system call 
      ret 
is_0  mov  dx,output_0 ;address of output 
      mov  ah,09  ;service - display message 
      int  21h   ;DOS system call 
      ret 

main:  mov  al,00 ;clear the screen 
      mov  ah,06 
      mov  bh,17h ;white on blue 
      mov  dh,05 ;set row to 5 
      mov  dl,10 ;set column to 10 
      int  10h  ;screen handling 
      mov  dx,message 
      mov  ah,09 ;to display string 
      int  21h  ;DOS interrupt to display string 
      mov  ah,07 ;single char keyboard input 
      int  21h  ;DOS interrupt 
      call str_to_num ;convert str to num 
      cmp  bh,1h ;test if bh contains 1 
      call error ;print error 
      cmp  bh,0h ;test if bh contains 0 
      mov  si,bl ;si contains address of number string 
line_loop: mov  cx,7 ;once for each line 
      jmp  print_num ;print the number 
      loop line_loop ;decrement cx, repeat if cx<>0 
      int  20h 
+0

'jmp message'? Почему вы хотите это сделать*? –

ответ

1

псевдопользователей-код, как отображать один из ваших 8 * 7 символов:

ptr = &enl_num1 + (number-1)*7 
for row = 0..6 do 
    mask = 80h  // start with the left-most bit 
    for column = 0..7 do 
    if ptr[row] AND mask then 
     put_char('$') 
    else 
     put_char(' ') 
    mask >>= 1 
    end for 
    put_string("\n") 
end for 

Кстати, это не будет работать:

loop print_num ;decrement cx, repeat loop if cx <>0 
db  ' ',0ah,0dh,'$' 
mov  ah,09 ;to display string 
int  21h  ;DOS interrupt 

Если вы перемежайте данные с кодом, который вам нужно проскочить мимо данных, иначе процессор попытается выполнить данные, как если бы это был код.

+0

ok любая идея о том, как перевести этот код psudo в NASM? Я новичок на собрании, это моя первая программа, которую я пытаюсь написать. – Dmon