当前位置: 代码迷 >> 汇编语言 >> 【新手上路】关于偏移地址的有关问题,附上代码,大神帮忙看看
  详细解决方案

【新手上路】关于偏移地址的有关问题,附上代码,大神帮忙看看

热度:103   发布时间:2016-05-02 04:35:58.0
【新手上路】关于偏移地址的问题,附上代码,大神帮忙看看
TITLE   8086 Code Template (for EXE file)

;       AUTHOR          emu8086
;       DATE            ?
;       VERSION         1.00
;       FILE            ?.ASM

; 8086 Code Template

; Directive to make EXE output:
       #MAKE_EXE#

DSEG    SEGMENT 'DATA'

BUFA DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
CNT1 EQU ($-BUFA)

BUFB DB 1,2,3,4,5,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30
CNT2 EQU ($-BUFB)  

BUFC DB 15 DUP(0)

DSEG    ENDS

SSEG    SEGMENT STACK   'STACK'
        DW      100h    DUP(?)
SSEG    ENDS

CSEG    SEGMENT 'CODE'

;*******************************************

START   PROC    FAR

; Store return address to OS:
    PUSH    DS
    MOV     AX, 0
    PUSH    AX

; set segment registers:
    MOV     AX, DSEG
    MOV     DS, AX
    MOV     ES, AX

    LEA SI,BUFA
   ; LEA DI,BUFB                    ;问题出在这里,看下面
    MOV BX,0      
   
    
N:
    MOV AL,[SI]        
    MOV DI,0
    
N1:
    MOV DL,BUFB[DI]                  ;这两条指令如果我用 MOV  AL,[DI] 的话DI指向的地址就会指到BUFA去了,这是为什么?
    CMP AL,BUFB[DI]                   ;
    JZ OP
    INC DI
    CMP DI,CNT2
    JZ N2
    JMP N1
    
    
    
OP:
    MOV CL,[SI] 
    MOV BUFC[BX],CL
    INC BX
    INC SI
    CMP SI,CNT1
    JZ N3
    JMP N
  
N2:
   INC SI   
   CMP SI,CNT1
   JZ N3
   JMP N  
  
    
N3:
   
   
    
    

    





; return to operating system:
    RET
START   ENDP

;*******************************************

CSEG    ENDS 

        END    START    ; set entry point.

------解决方案--------------------
N:
    MOV AL,[SI]        
    MOV DI,0   ;有这 条,那 LEA DI,BUFB    这条 有没有都 没关系。
    
N1:
    MOV DL,BUFB[DI]        

、、、、、、、、、、、、、
MOV DL,BUFB[DI]                  ;这两条指令如果我用 MOV  AL,[DI] 的话DI指向的地址就会指到BUFA去了,这是为什么?
    CMP AL,BUFB[DI]                   ;

是?:
MOV  AL,[DI]
CMP AL,BUFB[DI]     ;  al寄存器 被共用了,al 存储的是 bufb的地址,在直接跳转到 标号N1处时,肯定有问题。

看LEA 与OFFSET 指令说明 与 区别,或许对你有帮助



你看的是哪本书?程序功能不知道是做什么用的。。。

------解决方案--------------------
引用
这两条指令如果我用 MOV  AL,[DI] 的话DI指向的地址就会指到BUFA去了,这是为什么?
你上面不是 mov di, 0 吗,数据段开始不就是 BUFA 么?而 BUFB[DI] 则是 BUFB 开始再加上 DI ,当然就是从 BUFB 开始偏移 DI 了。
  相关解决方案