Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2016, 20:43   #1
Exclusive634
Новичок
Джуниор
 
Регистрация: 13.12.2016
Сообщений: 1
По умолчанию Ошибка в TASM c переходом Дальней подпрограммы(отдельный сегмент)

Код:
  stck    segment stack
dw	10h dup(0)   ;16 слов, инициализированных	нулем
	     stck    ends
	     data    segment
		     atmp db 0h
		     btmp db 0h
		     сtmp dw 0h
			 bol dw 0h
			 x dw (?)
		     massiv dw 4 dup (?)
 		     massiv2  dw 4 dup (?)
		     i db 11b
		     data    ends
			 PrcCode	segment
		 podproc proc far
		     push bp		     ;С‘охранение регистра BP
		 mov bp,sp
		     mov bx,[bp+4]
		     cmp bl,al
		     jne e
			     mov bx, offset massiv2
		     mov [bx+di],si
		     inc di
 			     e:
		     inc si
		     pop bp
	     ret 2
	     podproc endp
			PrcCode	ends		;конец сегмента подпрограммы
		     code    segment
		     assume cs:code, ds:data,ss:stck
main:
		     mov dx, data
		     mov ds, dx

		     call input
		     ;-------------------------------основная программа-------------------------
		     GO:
		     call mainproc

	     call outtoscreen2

	     pause: in al, 60h
		     cmp al, 01h
		     jne pause
	     quit:   mov ax, 4C00h
 		     int  21h
		     ;--------------------------------------------------------------------------
	     beep proc

     mov atmp,al
	     mov btmp,bl
	     mov сtmp,cx
	     mov bx,bol
		     cmp bol,1h
		     je	next
	     mov bol,0h
		     jmp endbeep
	     next:
		     mov al, 24h
		     out 42h, al
	     mov al, 0Eh
		     out  42h, al
		     in	al, 61h
		     or	al, 00000011b
		     out 61h, al
	     xor cx, cx
     l1:     mov bx, cx
		     mov cx, 4h
	     l2:     loop l2
	     mov cx, bx
	     loop l1
	     in	al, 61h
		     and al, 11111100b
		     out 61h, al
		     mov al,atmp
	     mov bl,btmp
	     mov cx,сtmp
     mov bol,0h
	     jmp inloop
		     endbeep:
		     ret
		     beep endp
		     ;--------------------------------------------------------------------------
		     outtoscreen proc
		     mov bx, 8000h
mov di, 80*2
	     mov si,0h
		     beg:
	     mov bx, 8000h
		 cmp si,4h
		     je	bye
		     outloop:
			     push bx
	     xor bx,bx
		     xor ax,ax
		     mov bx, offset massiv
		     mov ax, [bx+si]
		     pop bx
		     test ax, bx
	     jnz bit1
		     mov es:[di], 0730h	;если 0, вывести 0
	     jmp NxtBit
	     bit1:   mov es:[di], 0731h	;если 1, вывести 1
		     NxtBit: inc di
		     inc di
		     shr bx, 1
		     jnc outloop
			     inc si
		     mov es:[di], 0720h
		     inc di
		     inc di
		     jmp beg
		     bye:
		     ret
		     outtoscreen endp
	     ;--------------------------------------------------------------------
		     outtoscreen2 proc
		     mov bx, 8000h
			     mov di, 80*4
			     mov si,0h
		     beg2:
		     cmp si,4h
		     je	bye2
		     outloop2:
		     mov es:[di], 0720h
		     push bx
		     xor bx,bx
		     xor ax,ax
			     mov bx, offset massiv2
		     mov al, [bx+si]
		     pop bx
     shr al,4

	     add al,'0'
		     mov es:[di], al
			     inc di
		     push bx
		     xor bx,bx
		     xor ax,ax
		     mov bx, offset massiv2
		     mov al, [bx+si]
		     pop bx
		     and al,0Fh
		     add al,'0'
		     inc di
		     mov es:[di], al

		     inc di
		     inc di
		     inc si
		     mov es:[di], 0720h
		     inc di
		     inc di

		     jmp beg2
		     bye2:
		     ret
			     outtoscreen2 endp
		     ;----------------------------------input-------------------------------
			     input proc
			     mov dx, 0B800h
		     mov es, dx
    xor di, di
    		     xor dx, dx
   		     mov ax, 0720h
    		     mov cx, 80*25
    			     rep stosw
    		     xor di, di
    			     push si
    			     mov si,0
    			     opanki:
    		     mov cx, 2h
   			     inloop:
    		     call beep
    		     in	 al, 60h
    		     cmp al, bl
		     je	 inloop
	     mov bl, al
	     cmp al, 01h
		     jne NotEsc
			     jmp quit
	     NotEsc: cmp al, 02h
 			     je	 num1
  		     cmp al, 39h
   		     je	 space
  	     cmp al, 0Bh
   		     jne notlegal
   	     shl dx, 1
    	     mov es:[di], 0730h
    	     mov bol,1h
    			     jmp NxtNum
    			     notlegal:
    	     mov bol,0h
   		     jmp inloop
    		     space:
    		     mov es:[di], 0720h
    		     mov bol,1h
    		     inc di
    			     inc di
   	     jmp inloop
         num1: shl dx, 1
  	     or	 dx, 1
 		     mov es:[di], 0731h
  	     mov bol,1h
   		     jmp NxtNum
    		     NxtNum:
   			     inc di
   			     inc di
    			     dec cx
    			     jnz inloop
    	     mov dh,0h
   	     mov x, dx
   	     mov atmp,al
    	     mov btmp,bl
   		     mov bx, offset massiv
    			     mov [bx+si],dl
   			     mov dx,0b
    		     mov bl,btmp
    			     mov al,atmp
    			     inc si
   			     cmp si,4h
    		     jl	menche
    			     ;call outtoscreen
  			     jmp GO
		     menche: jmp opanki
    			     exitforinput:
 		     ret
   		     input endp
    			     ;---------------------------------------mainproc------------------------------
    		     mainproc proc
  
			     obrab:
  			     mov al,i
    			     mov di,0h ;счётчик второго массива
  			     mov cx,4h
		     mov si,0h;счётчик первого массива
		     LP:
			     mov bx, offset massiv
		     mov dl,[bx+si]
		     push dx
	     call far ptr podproc
    
	     loop LP

		     mov cx,4h
	     mov dl,99h
			     LP2:
			     mov bx, offset massiv2
		     mov [bx+di],dl
 			     inc di
	     loop LP2
 
		     ret
		     mainproc endp
		     ;----------------------------------------------------------------------
		    
		     code    ends
			     end main
В общем вот код полный программы, Ругается на 20 строку:
"Near jump or call to different CS"
Вроде как метка в том же сегменте находится. Помогите плиз.
Exclusive634 вне форума Ответить с цитированием
Старый 13.12.2016, 21:49   #2
Троллев
Пользователь
 
Регистрация: 09.03.2016
Сообщений: 29
По умолчанию

Как кажется, MASM, ругается на самые правильные, естественные с виду команды.

При компиляции вашего кода например mov es:[di], 0730h ;если 0, вывести 0

invalid instructyon operands

И инвалидов штук двадцать. Почти.
Троллев вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TASM дело тонкое!:) (Где в TASM IDE?) 3.14oner Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 15.11.2011 16:20
Ошибка со счетчиком адреса (Assembler TASM) Fata1ity Помощь студентам 0 28.05.2010 03:08
Ошибка компиляции при вызове подпрограммы Android_ua Общие вопросы C/C++ 4 02.03.2010 12:20
Как вынести объявление переменных в отдельный сегмент кода boris-blade Microsoft Office Word 1 16.01.2010 19:31