. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->汇编语言学习交流区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  大家帮我看看我的实验11有什么问题?  [待解决] 回复[ 2次 ]   点击[ 359次 ]  
zhangzl419
[帖 主]   [ 发表时间:2009-08-26 13:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-02-20 19:29
我实验11的源程序:

;文件  C:/MASM/src/xles.asm

assume         cs:codesg

datasg        segment
        db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg        ends

codesg        segment

begin:
        mov ax,datasg
        mov ds,ax
        mov si,0
        call letterc
        
        mov ax,4c00h
        int 21h
letterc:
        push ax
        push cx
        
        mov al,[si]
        mov cl,al
        mov ch,0
        jcxz ok

        cmp al,61h                     
        jb unch

        cmp al,7ah
        ja unch

        and al,11011111b
        mov [si],al
unch:
        inc si
        jmp  letterc
ok:
        pop cx
        pop ax
        ret

codesg        ends

end begin

我不知道为什么,汇编、链接生成的可执行文件每次双击运行,Windows总是会报错,错误消息:

C:\MASM\src\xles.exe
NTVDM CPU 遇到无效的指令。
CS:0E56 IP:ff1e OP:63 00 43 0e 75 选择“关闭”终止应用程序。

在debug中单步执行,到call指令时用p指令,也会出现类似的报错。

各位看看,是什么原因?
young9zh
[第1楼]   [ 回复时间:2009-08-28 09:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-27 13:27
将mov ax,datasg 改为mov ax,offset datasg 即可。
abob
[第2楼]   [ 回复时间:2009-08-28 11:27 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
错误原因是jmp  letterc 执行后,返回标号letterc处,多次执行push指令,而ok处的pop只执行一次,所以在执行标号ok处ret指令时无法找到正确的返回地址。

跟踪一下比较容易发现,这样的错误多半是子程序无法正确找到返回的地址。对于跟踪,可以找找小技巧,比如把数据段定义改为db "Be.",0,不仅有大小写字母还有非字母,基本全面的检测了子程序,跟踪循环次数也比较少容易找到问题。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved