Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Помогите разобраться в программе


Автор: Krazyzy 1.5.2011, 16:24
Помогите раскомментировать программу (программа - игра змейка) 

Код

;worm.asm
;ЏЁв®­
      .model tiny
      .code
      .186
      org 100h
start:
      mov ax, cs           ;заносим в ax адресс сегмента кода cs
      add ax, 1000h        ;добавляем к ax 1000
      mov ds, ax           ;данные будут считываться с адреса cs + 1000h
      

      push 0A000h          
      pop es
      mov ax, 13h
      int 10h              
      mov di, 320*200
      mov cx, 600h
      rep stosb             ;очистка экрана

      xor si, si              
      mov bp, 10
      jmp init_food
main_cycle:
      mov dx, 20000
      mov ah, 86h
      int 15h
      mov ah, 1
      int 16h
      jz short no_keypress
      xor ah, ah
      int 16h
      cmp ah, 48h
      jne short not_up
      mov word ptr cs:move_direction, -320h
not_up:
      cmp ah, 50h
      jne short not_down
      mov word ptr cs:move_direction, 320
not_down:
      cmp ah, 4Bh
      jne short not_left
      mov word ptr cs:move_direction, -1
not_left:
      cmp ah, 4Dh
      jne short no_keypress
      mov word ptr cs:move_direction, 1
no_keypress:
      and bp, bp
      jnz short advance_head
      lodsw

      xchg bx, ax
      mov byte ptr es:[bx], 0
      mov bx, ax
      inc bp
advance_head:
      dec bp
      add bx, word ptr cs:move_direction

      mov al, es:[bx]
      and al, al
      jz short move_worm
      cmp al, 0Dh
      je short grow_worm
      mov ax, 3
      int 10h
      retn

move_worm:
      mov [di], bx
      inc di
      inc di
      mov byte ptr es:[bx], 09
      cmp byte ptr cs:eaten_food, 1
      je if_eaten_food
      jmp short main_cycle
grow_worm:
      push bx
      mov bx, word ptr cs:food_at
      xor ax, ax
      call draw_food
      call random
      and ax, 3Fh
      mov bp, ax
      mov byte ptr cs:eaten_food, 1
      pop bx
      jmp short move_worm
if_eaten_food:
      mov byte ptr cs:eaten_food, 0
init_food:
      push bx
make_food:
      call random
      and ax, 0FFFEh
      mov bx, ax
      xor ax, ax
      cmp word ptr es:[bx], ax
      jne make_food
      cmp word ptr es:[bx+320], ax
      jne make_food
      mov ax, 0D0Dh
      call draw_food
      pop bx
      jmp main_cycle
draw_food:
      mov es:[bx], ax
      mov word ptr es:[bx+320], ax
      retn
random:
      mov ax, word ptr cs:seed
      mov dx, 8E45h
      mul dx
      inc ax
      mov cs:word ptr seed, ax
      retn

eaten_food      db      0
move_direction  dw      1

seed:
food_at equ     seed+2
        end start

Автор: iff 1.5.2011, 21:13
Цитата(Krazyzy @  1.5.2011,  16:24 Найти цитируемый пост)
      mov ax, cs           ;заносим в ax адресс сегмента кода cs
      add ax, 1000h        ;добавляем к ax 1000
      mov ds, ax           ;данные будут считываться с адреса cs + 1000h

Не хорошо. Здесь могут быть данные других программ т.к. эта область выходит в любом случае за разрешенную (в PSP по адресу 02-03 находится Объем оперативной памяти в пунктах).
Нужно использовать либо exe-формат, либо функцию 48h прерывания INT 21h для выделения памяти.

Автор: Krazyzy 2.5.2011, 22:56
Да мне ее тащемта запускать особо ненадо, просто понятькак работает)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)