首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

improper operand type 和phase error between passes异常,求大神啊

2013-07-01 
improper operand type 和phase error between passes错误,求大神啊!将两个递增有序数组归并成一个数组da

improper operand type 和phase error between passes错误,求大神啊!
;将两个递增有序数组归并成一个数组
data segment
A dw 1,3,5,7,9
B dw 0,2,4,6,8
C dw 20 dup(?)
string1 db 'the A array's numbers are:','$',0dh,0ah,'the B array's numbers are:','$'
string2 db 0dh,0ah,'when finished,the C array's numbers are:','$'
data ends

code segment
assume cs:code,ds:data
main proc far
start:
push ds
sub ax,ax
push ax

mov dx,offset string1
mov ah,9
int 21h               ;输出A,B数组都有些什么数据

mov ax,data
mov ds,ax             ;源数据用ds
mov es,ax
cld                   ;从左往右开始比较  
lea di,B              ;把B数组的偏移地址放到目的寄存器di中
mov bx,0  ;初始化C单元
mov cx,10  ;比较次数
mov si,0              ;从A单元的第一个元素开始
next:
push di
push cx               ;保护di,cx

mov ax,A[si]
cmp B[di],ax
jl set1  ;若B[si]<ax
jnl set2  ;若B[si]>=ax
jmp loop1
set1:                     ;存B
mov C[bx],B[di]
add bx,2
add di,2              ;如果是B数组中的数字存进C单元,则B数组继续下一次寻找
jmp loop1
set2:                     ;存A
mov C[bx],ax     
add si,2     
add bx,2
jmp loop1
loop1:
pop cx
pop di
loop next
end_m:                    ;因为是用B与A比较,所以如果最后A有剩余,则直接补到C单元后面
cmp A[si],0
jne conect
conect:
mov C[bx],A[si]
ret

mov dx,string2
mov ah,9
int 21h
main endp
code ends

end start



上面的程序编译不成功,不知道是哪里出错了,首次学汇编,很多不懂的。红色部分就是出错的地方,无外呼就是improper operand type 和phase error between passes错误这两个错误,有谁知道是哪里出错吗?谢谢!
[解决办法]
调试了一下能通过了。
data segment
A dw 1,3,5,7,9
B dw 0,2,4,6,8
C1 dw 20 dup(?)
string1 db "the A arrays number's are:",'$',0dh,0ah,"the B arrays number's are:",'$'


string2 db 0dh,0ah,"when finished,the C arrays number's are:",'$'
data ends

code segment
assume cs:code,ds:data
main proc far
start:
push ds
sub ax,ax
push ax

mov ax,data
mov ds,ax

mov dx,offset string1
mov ah,9
int 21h               ;输出A,B数组都有些什么数据

mov ax,data
mov ds,ax             ;源数据用ds
mov es,ax
cld                   ;从左往右开始比较  
lea di,B              ;把B数组的偏移地址放到目的寄存器di中
mov bx,0   ;初始化C单元
mov cx,10   ;比较次数
mov si,0              ;从A单元的第一个元素开始
next:
push di
push cx               ;保护di,cx 

mov ax,A[si]
cmp B[di],ax
jl set1   ;若B[si]<ax
jnl set2   ;若B[si]>=ax
jmp loop1
set1:
mov ax,B[di]                     ;存B
mov C1[bx],ax
add bx,2
add di,2              ;如果是B数组中的数字存进C单元,则B数组继续下一次寻找
jmp loop1
set2:                     ;存A
mov C1[bx],ax     
add si,2     
add bx,2
jmp loop1
loop1:
pop cx
pop di
loop next
end_m:                    ;因为是用B与A比较,所以如果最后A有剩余,则直接补到C单元后面
cmp A[si],0
jne conect
conect:
mov ax,A[si]
mov C1[bx],ax
ret

lea dx,string2
mov ah,9
int 21h
main endp
code ends

end start

热点排行