【新手上路】关于偏移地址的有关问题,附上代码,大神帮忙看看
【新手上路】关于偏移地址的问题,附上代码,大神帮忙看看
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 di, 0 吗,数据段开始不就是 BUFA 么?而 BUFB[DI] 则是 BUFB 开始再加上 DI ,当然就是从 BUFB 开始偏移 DI 了。
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 di, 0 吗,数据段开始不就是 BUFA 么?而 BUFB[DI] 则是 BUFB 开始再加上 DI ,当然就是从 BUFB 开始偏移 DI 了。