Assembler помогите с ошибкой в коде

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Torkmen, 29 May 2013.

  1. Torkmen

    Torkmen New Member

    Joined:
    27 Aug 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    #make_COM#

    ; COM file is loaded at CS:0100h

    .286
    .model tiny
    .code
    org 100h
    start: mov ax,3;текстовый режим 80х25 символов, если учесть размер символа
    int 10h;8х8 соответствует графическому режиму 640х200
    mov dx,offset string1;выводим сообщение как выйти из программы
    mov ah,9
    int 21h
    mov ax,0;Функция 00h предназначена для выяснения, загружен ли в память
    int 33h;драйвер мыши. Если эта функция возвращает AX = 0, то драйвер
    test ax,ax;отсутствует. Если драйвер загружен, то AX = 0FFFFh , а в
    jz exit;регистре BX - число кнопок мыши
    mov ax,0Ch;Функция 0Ch позволяет программно задать реакцию на события
    push cs;связанные с мышью: ее перемещения, нажатие и отпускание кнопок.
    pop es;События, на которые необходимо реагировать, должны быть отмечены
    mov cx,2;единицами в соответствующих разрядах регистра CX. CX=2 - вызвать подпро-грамму,
    mov dx,offset mouse;если левая клавиша отпущена. После выполнения этой
    int 33h;функции драйвер мыши на каждое из заданных событий будет
    ;реагировать вызовом обработчика событий - подпрограммы, FAR-указатель на адрес
    ;которой был указан в регистрах ES : DX
    mov ax,1;Функция 01h включает изображение курсора мыши на экране.
    int 33h
    xor ax,ax;ждем пока не нажмут на клавиатуру
    int 16h
    exit: int 20h;завершаем программу
    mouse proc far
    push cs
    pop ds
    push 0B800h
    pop es
    mov ax,cx;в CX и DX - координаты курсора
    mov di,dx;в DI будут координаты надписи
    shl di,2;di=dx*4
    add di,dx;di=dx*5
    shl di,2;di=dx*20
    shr cx,2
    add di,cx;di=dx*20+cx/4
    mov bl,10
    div bl
    or ah,30h
    mov string[4],ah
    aam
    add ax,3030h
    mov string[2],ah
    mov string[3],al
    mov ax,dx
    div bl
    or ah,30h
    mov string[10],ah
    aam
    add ax,3030h
    mov string[8],ah
    mov string[9],al
    mov ax,3;стираем с экрана предыдущую надпись
    int 10h
    mov si,offset string
    mov cx,string1-string;длина надписи
    mov ah,0Fh;аттрибуты надписи (белое на черном)
    @@: lodsb
    stosw;выводим координаты на экран в заданную позицию
    loop @b
    retf
    mouse endp
    string db "x= y= "
    string1 db "для выхода из программы нажмите на Esc$"
    end start
     
  2. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    лень виртуалку запускать,какая ошибка?
     
  3. Torkmen

    Torkmen New Member

    Joined:
    27 Aug 2012
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Вот что выдаёт!!!!
    [4] lllegal instruction: .286 or wrong parameters.
    [16] ?Condition Jump out of rangel: jz exit -This may be caused by following errors!
    [61]Wrong parameters: MOV cx,string1-string
    [61]Operands do not match 16 bit Register and 8 bit Effective Address
     
  4. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    442
    Reputations:
    288
    чем то ты не тем компилишь,

    Code:
     
    
    
    ; COM file is loaded at CS:0100h
    
    .286
    .model tiny
    .code
    org 100h
    start:	mov ax,3;текстовый режим 80х25 символов, если учесть размер символа
    int 10h;8х8 соответствует графическому режиму 640х200
    mov dx,offset string1;выводим сообщение как выйти из программы
    mov ah,9
    int 21h
    mov ax,0;Функция 00h предназначена для выяснения, загружен ли в память
    int 33h;драйвер мыши. Если эта функция возвращает AX = 0, то драйвер
    test ax,ax;отсутствует. Если драйвер загружен, то AX = 0FFFFh , а в
    jz exit;регистре BX - число кнопок мыши
    mov ax,0Ch;Функция 0Ch позволяет программно задать реакцию на события
    push cs;связанные с мышью: ее перемещения, нажатие и отпускание кнопок.
    pop es;События, на которые необходимо реагировать, должны быть отмечены
    mov cx,2;единицами в соответствующих разрядах регистра CX. CX=2 - вызвать подпро-грамму,
    mov dx,offset mouse;если левая клавиша отпущена. После выполнения этой
    int 33h;функции драйвер мыши на каждое из заданных событий будет
    ;реагировать вызовом обработчика событий - подпрограммы, FAR-указатель на адрес
    ;которой был указан в регистрах ES : DX
    mov ax,1;Функция 01h включает изображение курсора мыши на экране.
    int 33h
    xor ax,ax;ждем пока не нажмут на клавиатуру
    int 16h
    exit:	int 20h;завершаем программу
    mouse proc far
    push cs
    pop ds
    push 0B800h
    pop es
    mov ax,cx;в CX и DX - координаты курсора
    mov di,dx;в DI будут координаты надписи
    shl di,2;di=dx*4
    add di,dx;di=dx*5
    shl di,2;di=dx*20
    shr cx,2
    add di,cx;di=dx*20+cx/4
    mov bl,10
    div bl
    or ah,30h
    mov string[4],ah
    aam
    add ax,3030h
    mov string[2],ah
    mov string[3],al
    mov ax,dx
    div bl
    or ah,30h
    mov string[10],ah
    aam
    add ax,3030h
    mov string[8],ah
    mov string[9],al
    mov ax,3;стираем с экрана предыдущую надпись
    int 10h
    mov si,offset string
    mov cx,string1-string;длина надписи
    mov ah,0Fh;аттрибуты надписи (белое на черном)
    @@:	lodsb
    stosw;выводим координаты на экран в заданную позицию
    loop @@
    retf
    mouse endp
    string db "x= y= "
    string1 db "для выхода из программы нажмите на Esc$"
    end start
    
    компиляция-
    tasm.exe New.asm
    tlink.exe /t New.obj
    проверил-работает