当前位置: 代码迷 >> 汇编语言 >> 王爽 实验十(3) 编译不通过
  详细解决方案

王爽 实验十(3) 编译不通过

热度:253   发布时间:2016-05-02 04:38:51.0
王爽 实验10(3) 编译不通过
用12666字符显示在 第8行3列 白底绿色

初次代码 编译卡在光标处  求指错  前3个实验都是卡在光标处  不知是否有联系

assume cs:code
data segment
   db 10 dup (0)
data ends

code segment

start:

  mov dh,8
  mov dl,3
  mov cl,2         ; 3 lines  参数

  call show_str


  mov cx,0
  mov di,0
  mov ax,12666
                  mov bx,data
  mov ds,bx
  mov bl,10
  mov si,0         ;初始化寄存器

  call s

  mov ax,4c00h
  int 21h

show_str:                          ;子程序1

  mov al,160
  mul dh
  mov bx,ax
  mov al,2
  mul dl
  add ax,bx
  mov di,ax                ;设置显存位置到di
  mov ax,0b800h
  mov es,ax

  mov ax,data
  mov ss,ax
  mov sp,16
  push cx                  ;保护现场
  ret

s:                                 ;子程序2

  pop cx
  div bl
  mov cl,ah                ;ah 存余数,为零就结束循环
  mov ch,0
  jcxz ok 
  mov ds:[si],ah           ;余数存入ds段中
  inc si
  inc cx
  push cx                  ;记录循环次数
  jmp short s
  ;假设cx = 5

ok:                                ;子程序3  显示到显存
           mov si,cx                ;si=5
          mov ax,0
  mov al,[si-1]
  mov ah,02h
  sub si

  mov es:[di],ax
  add di,2
  loop ok

  ret

code ends
end start

------解决方案--------------------
      mov?ax,data
??????mov?ss,ax
??????mov?sp,16
??????push?cx??????????????????;保护现场
??????ret


1.data段定义了10字节,?(mov?sp,16)  这条指令执行后,你不觉得有问题么?

2.
=================
??????push?cx??????????????????;保护现场
??????ret
ret 指令建议你看看, 估计你在这指令 执行后,就出错了。 push cx  执行后,sp指向的数据为 cx中的数据 了,你再执行ret指令,能返回正确 的地址 才怪。
=================

(我没调试过你的代码,我认为 主要的问题出在 ?第2个问题上。 第一个问题,出于 段的默认选项(PARA:使用下一个可能节地址),倒不一定会出错。 最好的办法 还是自己 单步 跟踪,随时 查看 堆栈区,数据区,IP等,总能发出 出错的原因的。)



  相关解决方案