shenyuan 发表于 2015-3-16 18:44:31

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

本帖最后由 shenyuan 于 2015-3-16 22:26 编辑

DATAS SEGMENT
    dw 123,12666,1,8,3,38
    db 30 dup(0)
DATAS ENDS

STACKS SEGMENT
    dw 10 dup(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov ax,STACKS
    mov ss,ax
    mov sp,20
   ; 初始化数据段和栈段
    mov di,0
    mov ax,
    mov si,12 ;参数赋值
    ;参数=(ax) 存放地址=ds:
    call dtoc
    MOV AH,4CH
    INT 21H
dtoc:
   mov bx,10
sr: mov dx,0
    div bx
    push dx ; 把余数压栈
      mov cx,ax
      jcxz okd ;判断商是否为0
      jmp sr
okd: mov ax,20
      sub ax,sp
      mov bl,2
      div bl
      mov cl,al
      mov ch,0; 以上为计算栈中元素的数目, (20-sp)/2
s1:pop ax
         add al,30H
         mov ,al
         inc si
         loop s1
         mov byte ptr ,0         
    ret

CODES ENDS
    END START


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


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


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

shenyuan 发表于 2015-3-16 22:24:37

本帖最后由 shenyuan 于 2015-3-16 22:26 编辑

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

STACKS SEGMENT
    dw 10 dup(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov ax,STACKS
    mov ss,ax
    mov sp,20
   ; 初始化数据段和栈段
    mov di,0
    mov ax,
    mov si,12 ;参数赋值
    ;参数=(ax) 存放地址=ds:
    call dtoc
    MOV AH,4CH
    INT 21H
dtoc:
   mov bx,10
sr: mov dx,0
    div bx
    push dx ; 把余数压栈
      mov cx,ax
      jcxz okd ;判断商是否为0
      jmp sr
okd: mov ax,20
      sub ax,sp
      mov bl,2
      div bl
<font color="#ff0000">      dec al</font>
      mov cl,al
      mov ch,0; 以上为计算栈中元素的数目, (20-sp)/2
s1:pop ax
         add al,30H
         mov ,al
         inc si
         loop s1
         mov byte ptr ,0         
    ret

CODES ENDS
    END START


页: [1]
查看完整版本: 汇编语言 第十章 实验题第三题 遇到无效指令