17066038 发表于 2016-7-25 17:26:24

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

本帖最后由 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:
        sub bx,2

        loop s

        mov ax,4c00h
        int 21h
code ends

end start

我曹河蟹 发表于 2016-7-25 18:13:16

竟然直接执行完了{:10_257:}

17066038 发表于 2016-7-25 18:31:13

我曹河蟹 发表于 2016-7-25 18:13
竟然直接执行完了

...勿灌水

康小泡 发表于 2016-7-26 10:19:04

mov ax,a

      mov ss,ax

      mov sp,0h

你是把数据pop到了a里面,而不是B里面。a里面的数据是满的

donkkong 发表于 2016-7-26 11:49:45

将 mov bx,1eh改成 mov bx,0eh,测试有搬运效果,但这题的要求是使用PUSH指令练习,直接用pop好像不太好吧

Mr.Ding 发表于 2016-7-26 21:04:25

我把你的代码复制到我电脑上结果完美运行完了,一点问题也没出

1366627538 发表于 2016-7-27 20:51:23

正常执行,你可以尝试把bx=lf试试,不过不建议这样的做法,可以先入栈 用movsw 再出栈 这样可能编译器就能正常运行了

17066038 发表于 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,问题出在哪里,期待

17066038 发表于 2016-7-28 16:56:59

补充一下,bx=0eh,
也是不行的,sub bx,2依旧直接中断

17066038 发表于 2016-7-28 16:59:41

将ss段中的数据pop到ds段中有问题吗?
pop ds:这个语法对吗???
如果对,sub bx,2;bx=bx-2语法有问题吗?
如果都对,中断为何????????

17066038 发表于 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:
        mov es:,ax
        mov ax,ds:
        mov es:,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

17066038 发表于 2016-7-29 11:22:24

继续期待
    sub bx,2处为何执行错误??
的高手解释

17066038 发表于 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:
        mov es:,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处为何执行错误??
的高手解释

17066038 发表于 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:
        jcxz show_str_ok
        mov al,ds:
        mov es:,al
        mov es:,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

wimotek 发表于 2022-4-1 19:30:31

sp设置错误.pop溢出
页: [1]
查看完整版本: sub bx,2处为何执行错误??