鱼C论坛

 找回密码
 立即注册
查看: 1918|回复: 1

汇编语言 第十章 实验题第三题 遇到无效指令

[复制链接]
发表于 2015-3-16 18:44:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 shenyuan 于 2015-3-16 22:26 编辑
  1. DATAS SEGMENT
  2.     dw 123,12666,1,8,3,38
  3.     db 30 dup(0)
  4. DATAS ENDS

  5. STACKS SEGMENT
  6.     dw 10 dup(0)
  7. STACKS ENDS

  8. CODES SEGMENT
  9.     ASSUME CS:CODES,DS:DATAS,SS:STACKS
  10. START:
  11.     MOV AX,DATAS
  12.     MOV DS,AX
  13.     mov ax,STACKS
  14.     mov ss,ax
  15.     mov sp,20
  16.    ; 初始化数据段和栈段
  17.     mov di,0
  18.     mov ax,[di]
  19.     mov si,12 ;参数赋值
  20.     ;参数=(ax) 存放地址=ds:[si]
  21.     call dtoc
  22.     MOV AH,4CH
  23.     INT 21H
  24. dtoc:
  25.      mov bx,10
  26. sr: mov dx,0
  27.     div bx
  28.     push dx ; 把余数压栈
  29.         mov cx,ax
  30.         jcxz okd ;判断商是否为0
  31.         jmp sr
  32. okd: mov ax,20
  33.         sub ax,sp
  34.         mov bl,2
  35.         div bl
  36.         mov cl,al
  37.         mov ch,0  ; 以上为计算栈中元素的数目, (20-sp)/2
  38. s1:pop ax
  39.          add al,30H
  40.          mov [si],al
  41.          inc si
  42.          loop s1
  43.          mov byte ptr [si],0         
  44.     ret

  45. CODES ENDS
  46.     END START
复制代码



以上为汇编代码,我在进行单步调试的时候,总是在 第二次循环到 mov cx,ax的时候弹出如下
wuxiao.png

并且点击忽略继续弹出,一下为debug的截图,我的环境是xp虚拟机,已经重启过几次,所以确定不是偶然出现的。
debug.png

Anyone has any idea about what causes the problem, answer me.Thank you,希望有人可以到自己那边的环境测试一下,看看有没有出现同样的问题

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-16 22:24:37 | 显示全部楼层
本帖最后由 shenyuan 于 2015-3-16 22:26 编辑

调试了一晚上,用栈顶来计算压栈的方法容易出错,忘记了 call调用的时候进行了push ip 的操作,所以 元素数目应该是 减一的
  1. DATAS SEGMENT
  2.     dw 123,12666,1,8,3,38
  3.     db 30 dup(0)
  4. DATAS ENDS

  5. STACKS SEGMENT
  6.     dw 10 dup(0)
  7. STACKS ENDS

  8. CODES SEGMENT
  9.     ASSUME CS:CODES,DS:DATAS,SS:STACKS
  10. START:
  11.     MOV AX,DATAS
  12.     MOV DS,AX
  13.     mov ax,STACKS
  14.     mov ss,ax
  15.     mov sp,20
  16.    ; 初始化数据段和栈段
  17.     mov di,0
  18.     mov ax,[di]
  19.     mov si,12 ;参数赋值
  20.     ;参数=(ax) 存放地址=ds:[si]
  21.     call dtoc
  22.     MOV AH,4CH
  23.     INT 21H
  24. dtoc:
  25.      mov bx,10
  26. sr: mov dx,0
  27.     div bx
  28.     push dx ; 把余数压栈
  29.         mov cx,ax
  30.         jcxz okd ;判断商是否为0
  31.         jmp sr
  32. okd: mov ax,20
  33.         sub ax,sp
  34.         mov bl,2
  35.         div bl
  36. <font color="#ff0000">        dec al</font>
  37.         mov cl,al
  38.         mov ch,0  ; 以上为计算栈中元素的数目, (20-sp)/2
  39. s1:pop ax
  40.          add al,30H
  41.          mov [si],al
  42.          inc si
  43.          loop s1
  44.          mov byte ptr [si],0         
  45.     ret

  46. CODES ENDS
  47.     END START
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 20:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表