+ -
当前位置:首页 → 问答吧 → 汇编程序运行出错

汇编程序运行出错

时间:2011-11-24

来源:互联网

DATAS SEGMENT
  x dw ?
  array_head dw 3,5,15,23,37,49,52,65,78,99
  array_end dw 105
  n dw 32
DATAS ENDS

CODES SEGMENT

main proc far
  ASSUME CS:CODES,DS:DATAS
START:
  MOV AX,DATAS
  MOV DS,AX
  mov ax,datas
  mov ds,ax
  mov cx,11
  call print
  mov ax,n
  mov x,0ffffh
  mov si,0
compare:
  cmp array_end[si],ax
  jle insert
  mov bx,array_end[si]
  mov array_end[si+2],bx
  sub si,2
  jmp short compare
insert:
  mov array_end[si+2],ax
  mov cx,12
  call print
  ret
main endp

print proc near
  pop cx
  push ax
  push dx
  push si
  mov si,0
again:
  mov ax,array_head[si]
  mov dl,10
  div dl
  add al,30h
  add ah,30h
  mov dh,ah
  mov dl,al
  mov ah,2
  int 21h
  mov al,dh
  mov dl,al
  mov ah,2
  int 21h
  mov dl,08h
  mov ah,2
  int 21h
  add si,2
  loop again
  pop si
  pop dx
  pop ax
  ret
print endp
   
CODES ENDS
  END START

作者: nmvbxcz   发布时间: 2011-11-24

引用楼主 nmvbxcz 的回复:
DATAS SEGMENT
x dw ?
array_head dw 3,5,15,23,37,49,52,65,78,99
array_end dw 105
n dw 32
DATAS ENDS
CODES SEGMENT
main proc far
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
……

Assembly code


DATAS SEGMENT
  x dw ?
  array_head dw 3,5,15,23,37,49,52,65,78,99
  array_end  dw 105
  n dw 32
DATAS ENDS

CODES SEGMENT
main proc far
        ASSUME CS:CODES,DS:DATAS
START:
        MOV AX,DATAS
        MOV DS,AX
        mov ax,datas
        ;mov ds,ax   多余
        mov es,ax
        
        mov cx,11
        call print
        
        mov ax,n
        mov x,0ffffh
        mov si,0
compare:
        cmp array_end[si],ax
        jle insert                 ;?是有符号数吗?
        mov bx,array_end[si]
        mov array_end[si+2],bx
        sub si,2
        jmp short compare         ;本循环什么情况下结束?
insert:
        mov array_end[si+2],ax
        mov cx,12
        call print
        ret
main endp

print proc near
        pop cx        ;你在call时没有push参数
                    ;但这里来个pop,你把压栈的IP弹出来给CX了
        push ax
        push dx
        push si
        
        mov si,0
again:
        mov ax,array_head[si]
        mov dl,10
        div dl
        add al,30h  ;商加外套?
        add ah,30h  ;余数加外套
        mov dh,ah
        
        mov dl,al  ;显示商?
        mov ah,2
        int 21h
        
        mov al,dh ;显示余数?
        mov dl,al
        mov ah,2
        int 21h
        
        mov dl,08h ;退格?
        mov ah,2
        int 21h
        
        add si,2
        loop again
        
        pop si
        pop dx
        pop ax
        ret
print endp
    
CODES ENDS
  END START

作者: gsy999   发布时间: 2011-11-25