装配tasm错误相对超出范围

时间:2015-10-25 07:44:34

标签: assembly tasm

我对Assembly非常陌生,我正在尝试对任务进行编程,这需要将输入分成多达80个字符并通过按以下顺序对位进行修改来每24位(3个8位的块)进行修改5 - > ; 15 - > 20 - > 1→ 6(第5位到15位的位置,15位到20位的位置,依此类推)。但是,在替换最后的第5位> 15之后调用循环时,我得到相对跳出范围错误。有人可以告诉我这段代码有什么问题吗?我非常感谢这里的一些帮助。提前谢谢。

.model small
   ASSUME CS:kodas, DS:duomenys, SS:stekas
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
stekas segment word stack 'STACK'
   dw 400h dup (00)               ; stekas -> 2 Kb
stekas ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
duomenys segment para public 'DATA'

pranesimas1:
   db 'Enter row up to 80 symbols'
naujaEilute:   
   db 0Dh, 0Ah, '$'  ; tekstas ant ekrano
pranesimas2:
   db 'Entered symbols are grouped every 24 bits: ', 0Dh, 0Ah, '$'  
pranesimas3:
   db '24 bitu bloko bitai sukeiciami pagal schema: 5 -> 15 -> 20 -> 1-> 6: ', 0Dh, 0Ah, '$'
pranesimas4:
   db 'Amount of zero bits is:', 0Dh, 0Ah, '$'
buferisIvedimui:
   db 81, 00, 83 dup (0)  
a:
   db 00
b:
   db 00
c:
   db 00
bit0:
   dw 0000
bit1:
   dw 0000
buferisAtsakymui:
   sk1  db  00
   sk2  db  00      
   sk3  db  00
        db  0Dh, 0Ah,'$'  
duomenys ends

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LOCALS  @@

kodas segment para public 'CODE'
spausdinkBaitoDvKoda proc near

   push        dx
   push        ax
   push        cx
   push        bx 

   mov         cx, 0008
   mov dh,     al                                   
   mov bl,     10000000b                            

   @@ciklas_pagal_cx_nuo_8:
   mov dl,     dh
   and dl,     bl                                  
   dec cl                                          
   shr dl,     cl                                   
   shr bl,     1                                    
   inc cl                                           
   add dl,     '0'                                 
   mov ah,     02                                   
   int 21h                                          
   loop  @@ciklas_pagal_cx_nuo_8                    


   pop bx
   pop cx
   pop ax
   pop dx                
   ret
spausdinkBaitoDvKoda endp
;--------------------------------------------------------    
spausdinkTarpa proc near

   push        dx
   push        ax
   mov dl,     ' '                               
   mov ah,     02                                 
   int 21h
   pop ax
   pop dx                
   ret
spausdinkTarpa endp
;-------------------------------------------------------
skaiciuokBituSk proc near

   push        dx
   push        ax
   push        cx
   push        bx 

   mov         cx, 0008
   mov dh,     al                                  
   mov bl,     10000000b                            

   @@ciklas_pagal_cx_8:
   mov dl,     dh
   and dl,     bl                                   
   dec cl                                          
   shr dl,     cl                                  
   shr bl,     1                                    
   inc cl                                          
   xor ax,     ax                                   
   mov al,     dl                                      
   add word ptr bit0, ax
   loop  @@ciklas_pagal_cx_8                        

   mov cl,     byte ptr[buferisIvedimui + 1]        
   mov al,     cl                                  
   mov bl,     8                                    
   mul bl                                           
   sub ax, word ptr bit0                            
   mov word ptr bit1, ax                            


   pop bx
   pop cx
   pop ax
   pop dx                
   ret
skaiciuokBituSk endp
;-------------------------------------------------------
pradzia:

   mov ax,     seg duomenys                 
   mov ds,     ax

   mov ah,     09                           
   mov dx,     offset pranesimas1             
   int 21h

   mov ah,     0Ah                            
   mov dx,     offset buferisIvedimui         
   int 21h       

   mov ah,     09                            
   mov dx,     offset naujaEilute             
   int 21h


   mov ah,     09                             
   mov dx,     offset naujaEilute               
   int 21h

   mov ah,     09                            
   mov dx,     offset pranesimas2             
   int 21h

   xor cx,     cx                              
   mov cl,     byte ptr[buferisIvedimui + 1]   
   xor ax,     ax                              
   mov al,     cl                              
   mov bl,     byte ptr 3                      
   div bl                                      
   mov cl,     al                              
   xor bx,     bx                              
   mov bx,     2                               

   @@ciklas1_pagal_cx_nuo_baitu_skaiciaus:     


   mov al,     byte ptr[buferisIvedimui + bx + 2]  
   mov byte ptr c, al                             
   call SpausdinkBaitoDvKoda                       
   call spausdinkTarpa 
   mov al,     byte ptr[buferisIvedimui + bx + 1]  
   mov byte ptr b, al
   call SpausdinkBaitoDvKoda                       
   call spausdinkTarpa 
   mov al,     byte ptr[buferisIvedimui + bx]      
   mov byte ptr a, al                              
   call SpausdinkBaitoDvKoda                       
   call spausdinkTarpa                             

   ; 5 -> 15 -> 20 -> 1-> 6


   ;1->6
   mov ah,     byte ptr a                          
   and ah,     00000010b                           
   and byte ptr a,     10111101b                    
   shl ah,     1                                    
   shl ah,     1                                    
   shl ah,     1                                    
   shl ah,     1                                    
   shl ah,     1
   or  byte ptr a,     ah 

   ;20->1
   mov dl, byte ptr c
   and dl,     00010000b
   and byte ptr c,     11101111b
   shr dl,     1
   shr dl,     1
   shr dl,     1       
   or  byte ptr a,     dl

   ;15->20
   mov ah, byte ptr b
   and ah,     10000000b
   and byte ptr b,     01111111b
   shr ah,     1
   shr ah,     1
   shr ah,     1
   or  byte ptr c,     ah 

   ;5->15

   mov ah, byte ptr a
   and ah,     00100000b
   and byte ptr a,     11011111b
   shl ah,     1
   shl ah,     1
   or  byte ptr b,     ah 


   mov al, byte ptr a
   mov byte ptr[buferisIvedimui + bx], al 

   mov al, byte ptr b
   mov byte ptr[buferisIvedimui + bx + 1], al 

   mov al, byte ptr c
   mov byte ptr[buferisIvedimui + bx + 2], al 

   inc bx                                          
   add bx,     2

   loop @@ciklas1_pagal_cx_nuo_baitu_skaiciaus   

   mov ah,     09                                
   mov dx,     offset naujaEilute               
   int 21h


   mov ah,     09                                
   mov dx,     offset naujaEilute               
   int 21h

   mov ah,     09                            
   mov dx,     offset pranesimas3            
   int 21h

   xor cx,     cx                              
   mov cl,     byte ptr[buferisIvedimui + 1]   
   xor ax,     ax                              
   mov al,     cl                              
   mov bl,     byte ptr 3                     
   div bl                                      
   mov cl,     al                             
   xor bx,     bx                              
   mov bx,     2                               

   @@ciklas2_pagal_cx_nuo_baitu_skaiciaus:


   mov al,     byte ptr[buferisIvedimui + bx + 2]  
   call SpausdinkBaitoDvKoda                      
   call spausdinkTarpa 
   mov al,     byte ptr[buferisIvedimui + bx + 1]  
   call SpausdinkBaitoDvKoda                      
   call spausdinkTarpa 
   mov al,     byte ptr[buferisIvedimui + bx]      
   call SpausdinkBaitoDvKoda                      
   call spausdinkTarpa                            

   inc bx                                          
   add bx,     2

   loop @@ciklas2_pagal_cx_nuo_baitu_skaiciaus

   ;Calculating total amount of null bits
   xor cx,     cx                                  
   mov cl,     byte ptr[buferisIvedimui + 1]       
   mov bx,     2                                   

   @@ciklas1_pagal_cx_nuo_baitu_skaiciaus1:        

   mov al,     byte ptr[buferisIvedimui + bx]      
   call skaiciuokBituSk                            

   inc bx                                          

   loop @@ciklas1_pagal_cx_nuo_baitu_skaiciaus1   

   mov ax, word ptr bit1                          

   mov dx,     0000
   mov bx,     word ptr 10
   div bx                                          


   add dl, '0'       
   mov byte ptr sk3,  dl


   mov dx,     0000
   div bx


   add dl, '0'       
   mov byte ptr sk2,  dl


   mov dx,     0000
   div bx


   add dl, '0'       
   mov byte ptr sk1,  dl

   mov ah,     09                                
   mov dx,     offset naujaEilute               
   int 21h

   mov ah,     09                               
   mov dx,     offset naujaEilute              
   int 21h

   mov ah,     09                            
   mov dx,     offset pranesimas4          
   int 21h

   mov dx,     offset buferisAtsakymui
   mov ah,     09
   int 21h


   mov ah,     4ch                            
   int 21h

   mov ah, '?'
kodas  ends
end pradzia 

1 个答案:

答案 0 :(得分:1)

loop @@ciklas1_pagal_cx_nuo_baitu_skaiciaus会导致错误。 LOOP只能执行短跳转(-128到+127个字节)。在这种情况下,无法替换

dec cx
jne @@ciklas1_pagal_cx_nuo_baitu_skaiciaus

(参见https://stackoverflow.com/a/32769524/3512216),因为跳转对于条件跳转来说太宽了(jne)。有关补救措施,请查看https://stackoverflow.com/a/32626759/3512216

您可以让TASM进行转换。只需在文本开头添加JUMPS行。 TASM将无效循环转换为(我添加的标签名称):

loop LOOP
jmp ENDLOOP
LOOP:
jmp @@ciklas1_pagal_cx_nuo_baitu_skaiciaus
ENDLOOP: