young1048 发表于 2014-4-24 16:03:05

在王爽第7章,更灵活定位内存地址中, 代码编译完成后运行程序出现错误提示框



题目要求是,将数据段(4行4列,每行16个字节,每行前2个为空格)每行的前4个字母改成大写
程序源代码如下:
assume ds:datasg,cs:codesg,ss:stacksg

datasg segment
        db 'myloveis      '
        db 'young         '
        db 'andyou      '
        db 'jingjing      '
datasg ends

stacksg segment
        dw 0,0,0,0,0,0,0,0
stacksg ends

codesg segment
    start:mov ax,stacksg
              mov ss,ax
                  mov sp,16
                  
                  mov ax,codesg
                  mov ds,ax
                  mov bx,0
                  mov cx,4
          s1: push cx
              mov si,3
                  mov cx,4
          s2: mov al,
              and al,11011111b
                  mov ,al
                  inc si
                  loop s2
                  
                  add bx,16
                  pop cx
                  loop s1
                  
                  mov ax,4c00h
                  int 21h
       
codesg ends
end start

但编译完成后运行exe程序出现错误提示框,图如下:

经多次检查调试以及在网上查找资料都没有找出问题所在,希望大家能帮忙看下


nsonline 发表于 2014-4-24 16:33:52

在提示的地址上遇到一个不合法的指令,debug到那里看看是什么指令出错了

young1048 发表于 2014-4-24 17:48:55

nsonline 发表于 2014-4-24 16:33 static/image/common/back.gif
在提示的地址上遇到一个不合法的指令,debug到那里看看是什么指令出错了

debug过程中又没有出现这样的提示呀

为之疯狂 发表于 2014-4-24 17:49:50

刚我debug了一下,发现一个奇怪的地方就是,当外层循环第3次执行到 pop cx 之后 ,此时 cx 里的值是 2,本来下跳指令时 loops1,判断cx 是否等于0 ,但事件上是 ret XXXX ,他执行完这条指令之后,就吧ip改成了一个很大的数,不知道是跳到哪里去了, 而此时后面的代码是一样的了,我只能帮你到这里了,这个问题我反正是不知道是什么原因,下面是图 你自己看看,或者你也debug 一下http://v2.freep.cn/3tb_140424174430dfe4512293.jpg
页: [1]
查看完整版本: 在王爽第7章,更灵活定位内存地址中, 代码编译完成后运行程序出现错误提示框