鱼C论坛

 找回密码
 立即注册
查看: 7293|回复: 14

sub bx,2处为何执行错误??

[复制链接]
发表于 2016-7-25 17:26:24 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 17066038 于 2016-7-25 17:37 编辑

我练习实验五(6)的代码编写,为何在sub bx,2处执行了预料之外的结果

我的思路是将 段(dw 1,2,3,4,5,6,7,8)做为栈,逐步弹出栈中元素到b段(dw 0,0,0,0,0,0,0,0)
开始时bx指向b段(dw 0,0,0,0,0,0,0,0)的最后一个元素,然后逐步bx=bx-2,实现逆序排列的
结果第一次执行到sub bx,2时就发生了错误,,求解。。。。。
assume cs:code

a segment
dw 1,2,3,4,5,6,7,8
a ends

b segment
dw 0,0,0,0,0,0,0,0
b ends

code segment
start:
        mov ax,a
        mov ss,ax
        mov sp,0h

        mov ax,b
        mov ds,ax
        mov bx,1eh

        mov cx,8
s:        pop ds:[bx]
        sub bx,2

        loop s

        mov ax,4c00h
        int 21h
code ends

end start
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-25 18:13:16 From FishC Mobile | 显示全部楼层
竟然直接执行完了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-25 18:31:13 | 显示全部楼层

...勿灌水
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-26 10:19:04 | 显示全部楼层
mov ax,a

        mov ss,ax

        mov sp,0h
你是把数据pop到了a里面,而不是B里面。a里面的数据是满的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-26 11:49:45 | 显示全部楼层
将 mov bx,1eh改成 mov bx,0eh,测试有搬运效果,但这题的要求是使用PUSH指令练习,直接用pop好像不太好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-26 21:04:25 | 显示全部楼层
我把你的代码复制到我电脑上结果完美运行完了,一点问题也没出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 20:51:23 | 显示全部楼层
正常执行,你可以尝试把bx=lf试试,不过不建议这样的做法,可以先入栈 用movsw 再出栈 这样可能编译器就能正常运行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:52:52 | 显示全部楼层
首先感谢大家的回复!
请注意程序的问题:
1、用-t执行到sub bx,2就直接中断了,无法继续了
2、用-g可以执行,但是执行后虽然01----08倒序排列好了,但是原来a段的数据被改变了

1、我觉得是数据段、栈段的问题,它们之间是不是有什么冲突,没有处理好
“”bx=lf试试“”应该是不合理的,因为字型数据肯定是双数为地址的,1f是单数,明显不对的
2、push的方法我做过了,很正常,但是我第一次是用pop做的,所有我就是想解决关于pop对于这个程序的问题,请大家围绕此代码本身给出意见,二而请勿讨论给出别的解决实现逆序存放的编程方法
3、重点:pop,问题出在哪里,期待
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:56:59 | 显示全部楼层
补充一下,bx=0eh,
也是不行的,sub bx,2依旧直接中断
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-28 16:59:41 | 显示全部楼层
将ss段中的数据pop到ds段中有问题吗?
pop ds:[bx]这个语法对吗???
如果对,sub bx,2;bx=bx-2语法有问题吗?
如果都对,中断为何????????

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-29 11:20:23 | 显示全部楼层
分享一下我做的实验9的代码
welcome to masm! 绿色
welcome to masm!绿底红字
welcome to masm!白底蓝字
调试成功!
assume cs:code

data segment
        db 'welcome to masm!'
        db 02h,24h,71h                ;黑底绿字,绿底红字,白底蓝字
data ends

stack segment
db 16 dup(0)
stack ends

code segment
start:
        mov ax,data
        mov ds,ax
        
        mov ax,stack
        mov ss,ax
        
        mov ax,0b800h
        mov es,ax


        mov bp,0
        mov si,0
                
        mov cx,3
        mov cx,16
        
        mov cx,3        
s1:        push cx
        mov bx,0
        mov di,0
        mov cx,16
s:        mov ax,ds:[bx]
        mov es:[6e0h+36h+bp+di],ax
        mov ax,ds:[10h+si]
        mov es:[6e0h+37h+bp+di],ax
        inc bx
        add di,2
        loop s

        add bp,0a0h
        inc si
        pop cx
        loop s1

        mov ax,4c00h
        int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-29 11:22:24 | 显示全部楼层
继续期待
    sub bx,2处为何执行错误??
的高手解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-29 15:30:17 | 显示全部楼层
本帖最后由 17066038 于 2016-7-29 15:31 编辑

经过实验:
dos下 0b800:0000开始的前两行不能显示字符,字符是从第3行开始的,偏移地址要+320(每行80个字符160字节)才能正确显示程序中编写的字符
assume cs:code

data segment
        db 1600 dup(61h,24h)
data ends

code segment
start:
        mov ax,data
        mov ds,ax

        mov ax,0b800h
        mov es,ax

        mov bx,0
        mov cx,1600
s2:        mov ax,ds:[bx]
        mov es:[320+bx],ax
        add bx,2
        loop s2

        mov ax,4c00h
        int 21h
code ends
end start

写入时要注意字型与字节型数据的对应
合理利用ax和al
11#楼的代码有这个问题的瑕疵,可以利用 word ptr 对应ax或者byte ptr 对应al

继续期待
    sub bx,2处为何执行错误??
的高手解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-1 17:07:23 | 显示全部楼层
分享一下我练习实验10,8行3列显示绿色字符串,遇到0结束的代码
‘welcome to masm!’,0
assume cs:code

data segment
db 'welcome to masm!',0                ;32B
data ends

stack segment
dw 16 dup(0)                        ;32B
stack ends

code segment
start:
        mov ax,stack
        mov ss,ax
        mov sp,31
        
        mov dh,8
        mov dl,3
        mov cl,2
        mov ax,data
        mov ds,ax
        mov si,0
        call show_str
        mov ax,4c00h
        int 21h

show_str:
        push ds
        push es
        push si
        push di
        push ax
        push bx
        push cx
        push dx
        
        ;求目标地址
        mov ax,0b800h
        mov es,ax
        mov di,0
        
        mov ax,0
        mov al,160
        dec dh                        ;从0行开始计数
        add dh,2                ;显存从第3行开始显示
        mul dh
        add di,ax

        mov ax,0
        mov al,2
        dec dl
        mul dl
        add di,ax

        mov ah,cl
        mov cx,0

        ;向目标地址写入数据        
s:        mov cl,ds:[si]
        jcxz show_str_ok
        mov al,ds:[si]
        mov es:[di],al
        mov es:[di+1],ah
        inc si
        add di,2
        jmp s

show_str_ok:        
        pop dx
        pop cx
        pop bx
        pop ax
        pop di
        pop si
        pop es
        pop ds
        ret        

code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-1 19:30:31 | 显示全部楼层
sp设置错误.  pop溢出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 16:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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