;--------------------------------------------Поле стека ----------------------------------------- sseg segment 'stack' ; початок сегмента стека. db 128 dup (?) ; поле для стека розміром 128 байт. sseg ends ; кінець сегмента стека. ;--------------------------------------------Поля даних ----------------------------------------- dseg segment 'data' ; початок сегмента даних. text1 db 'Програма стартувала', 13, 10, '$' ; 23 байти з кодами символів text1. text2 db '((D^2-A)^2\D^2+B)-20 = $' ; поле розміром у 21 байт A dw 0Ah ; A:=10 B dw 4 ; B:=4 D dw -23; или -17h ; D:=-23 rez dw ? ; Rez:=? dseg ends ; кінець сегмента даних. ;--------------------------------------------Текст програми ------------------------------------- cseg segment 'code' ; початок сегмента команд. assume cs:cseg, ds:dseg, ss:sseg ; встановлення відповідності між ; сегментними регістрами (cs, ds, ss) і ; програмними сегментами (cseg, dseg, sseg). start proc far ; початок процедури start. mov ax, dseg ; ініціалізація сегментного регістра ds на mov ds, ax ; програмний сегмент даних dseg. ;------------------------------------------------------------------------------------------------ lea dx, text1 ; завантаження у регістр dx із сегмента ; даних адреси першого байт текста text1. call WrStr ; звернення до процедури WrStr ; виведення на екран текста text1. mov dx,offset text2 ; завантаження у регістр dx із сегмента ; даних адреси першого байт текста text2. call WrStr ; звернення до процедури WrStr ; виведення на екран текста text2. ;------------------------------------------------------------------------------------------------ mov ax,A ; ax:=A mul ax ; ax:=A^2 add ax,B ; ax:=A^2+B mov bx,ax ; bx:=A^2+B mov ax,D ; ax:=D imul ax ; ax:=D^2 sub ax,A ; ax:=D^2-A mul ax ; ax:=(D^2-A)^2 div bx ; ax:=(D^2-A)^2\(A^2+B) sub ax,20 ; ax:=(D^2-A)^2\(A^2+B)-20 mov rez, ax ; rez:=ax ;--------------------------------------Виведення результату на екран----------------------------- xor cx,cx ; обнуляємо cx mov bx,10 ; заносимо число 10d в регістр bx mod: xor dx,dx ; обнуляємо dx div bx ; ділення результату ax на bx push dx ; записуємо в dx остачу від ділення inc cx ; сх:=сх+1 or ax,ax ; якщо ax:=0 jnz mod ; якщо 0<ax<0 переходимо на мітку вище print: ; мітка print pop dx ; заносимо цифру старшого розряду із стека в dx add dl,30h ; отримуємо ASCII код цієї цифри (числа) mov ah,2 ; виведення його на екран з використанням ; функції 02 int 21h ; Преривання MS-DOC loop print ; Перехід на мітку print ;------------------------------------------------------------------------------------------------ mov ah,1 ; щоб програма не закривалася відразу int 21h ; і була можливість побачити результат mov ah, 4ch ; функція завершення програми Int 21h ; Преривання MS-DOC Start endp ; кінець процедури Start ;------------------------------------------------------------------------------------------------ WrStr proc near ; початок процедури WrStr. mov ah, 09h ; виведення на екран рядка символів, int 21h ; обмежених символом $ або кодом 24h. ret ; повернення з процедури. WrStr endp ; кінець процедури WrStr. ;------------------------------------------------------------------------------------------------- Cseg ends ; кінець сегмента команд. end start ; кінець програми-end, точка входу–start. При выполнении пишет -- "syntax error:mod" "missing operand after unary operator".
klzlk Трохи ты не туда послал. Он с Украины. Хлопец явно способный, но на русском трудно ему будет изучать. Да уж...
попробуй так: Код (Text): ;--------------------------------------------Поле стека ----------------------------------------- sseg segment 'stack' ; початок сегмента стека. db 128 dup (?) ; поле для стека розміром 128 байт. sseg ends ; кінець сегмента стека. ;--------------------------------------------Поля даних ----------------------------------------- dseg segment 'data' ; початок сегмента даних. text1 db 'Програма стартувала', 13, 10, '$' ; 23 байти з кодами символів text1. text2 db '((D^2-A)^2\D^2+B)-20 = $' ; поле розміром у 21 байт A dw 0Ah ; A:=10 B dw 4 ; B:=4 D dw -23; или -17h ; D:=-23 rez dw ? ; Rez:=? dseg ends ; кінець сегмента даних. ;--------------------------------------------Текст програми ------------------------------------- cseg segment 'code' ; початок сегмента команд. assume cs:cseg, ds:dseg, ss:sseg ; встановлення відповідності між ; сегментними регістрами (cs, ds, ss) і ; програмними сегментами (cseg, dseg, sseg). start proc far ; початок процедури start. mov ax, dseg ; ініціалізація сегментного регістра ds на mov ds, ax ; програмний сегмент даних dseg. ;------------------------------------------------------------------------------------------------ lea dx, text1 ; завантаження у регістр dx із сегмента ; даних адреси першого байт текста text1. call WrStr ; звернення до процедури WrStr ; виведення на екран текста text1. mov dx,offset text2 ; завантаження у регістр dx із сегмента ; даних адреси першого байт текста text2. call WrStr ; звернення до процедури WrStr ; виведення на екран текста text2. ;------------------------------------------------------------------------------------------------ mov ax,A ; ax:=A mul ax ; ax:=A^2 add ax,B ; ax:=A^2+B mov bx,ax ; bx:=A^2+B mov ax,D ; ax:=D imul ax ; ax:=D^2 sub ax,A ; ax:=D^2-A mul ax ; ax:=(D^2-A)^2 div bx ; ax:=(D^2-A)^2\(A^2+B) sub ax,20 ; ax:=(D^2-A)^2\(A^2+B)-20 mov rez, ax ; rez:=ax ;--------------------------------------Виведення результату на екран----------------------------- xor cx,cx ; обнуляємо cx mov bx,10 ; заносимо число 10d в регістр bx @mod: xor dx,dx ; обнуляємо dx div bx ; ділення результату ax на bx push dx ; записуємо в dx остачу від ділення inc cx ; сх:=сх+1 or ax,ax ; якщо ax:=0 jnz @mod ; якщо 0<ax<0 переходимо на мітку вище print: ; мітка print pop dx ; заносимо цифру старшого розряду із стека в dx add dl,30h ; отримуємо ASCII код цієї цифри (числа) mov ah,2 ; виведення його на екран з використанням ; функції 02 int 21h ; Преривання MS-DOC loop print ; Перехід на мітку print ;------------------------------------------------------------------------------------------------ mov ah,1 ; щоб програма не закривалася відразу int 21h ; і була можливість побачити результат mov ah, 4ch ; функція завершення програми Int 21h ; Преривання MS-DOC Start endp ; кінець процедури Start ;------------------------------------------------------------------------------------------------ WrStr proc near ; початок процедури WrStr. mov ah, 09h ; виведення на екран рядка символів, int 21h ; обмежених символом $ або кодом 24h. ret ; повернення з процедури. WrStr endp ; кінець процедури WrStr. ;------------------------------------------------------------------------------------------------- Cseg ends ; кінець сегмента команд. end start ; кінець програми-end, точка входу–start.
ну почему никто не сказал, что "mod" - зарезервированная операция, надо поменять на что-то другое (mod1, cycl, eklmn - на любое сочетание, не являющееся оператором языка или псевдооператором, или другим зарезервированным словом - естественно, соблюдая другие требования к меткам)? Это всяко короче и понятнее, чем повторять листинг с исправлением, не?