鱼C论坛

 找回密码
 立即注册
查看: 6614|回复: 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时就发生了错误,,求解。。。。。

  1. assume cs:code

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

  5. b segment
  6. dw 0,0,0,0,0,0,0,0
  7. b ends

  8. code segment
  9. start:
  10.         mov ax,a
  11.         mov ss,ax
  12.         mov sp,0h

  13.         mov ax,b
  14.         mov ds,ax
  15.         mov bx,1eh

  16.         mov cx,8
  17. s:        pop ds:[bx]
  18.         sub bx,2

  19.         loop s

  20.         mov ax,4c00h
  21.         int 21h
  22. code ends

  23. 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 | 显示全部楼层
  1. mov ax,a

  2.         mov ss,ax

  3.         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!白底蓝字
调试成功!

  1. assume cs:code

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

  6. stack segment
  7. db 16 dup(0)
  8. stack ends

  9. code segment
  10. start:
  11.         mov ax,data
  12.         mov ds,ax
  13.        
  14.         mov ax,stack
  15.         mov ss,ax
  16.        
  17.         mov ax,0b800h
  18.         mov es,ax


  19.         mov bp,0
  20.         mov si,0
  21.                
  22.         mov cx,3
  23.         mov cx,16
  24.        
  25.         mov cx,3       
  26. s1:        push cx
  27.         mov bx,0
  28.         mov di,0
  29.         mov cx,16
  30. s:        mov ax,ds:[bx]
  31.         mov es:[6e0h+36h+bp+di],ax
  32.         mov ax,ds:[10h+si]
  33.         mov es:[6e0h+37h+bp+di],ax
  34.         inc bx
  35.         add di,2
  36.         loop s

  37.         add bp,0a0h
  38.         inc si
  39.         pop cx
  40.         loop s1

  41.         mov ax,4c00h
  42.         int 21h
  43. code ends
  44. 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字节)才能正确显示程序中编写的字符
  1. assume cs:code

  2. data segment
  3.         db 1600 dup(61h,24h)
  4. data ends

  5. code segment
  6. start:
  7.         mov ax,data
  8.         mov ds,ax

  9.         mov ax,0b800h
  10.         mov es,ax

  11.         mov bx,0
  12.         mov cx,1600
  13. s2:        mov ax,ds:[bx]
  14.         mov es:[320+bx],ax
  15.         add bx,2
  16.         loop s2

  17.         mov ax,4c00h
  18.         int 21h
  19. code ends
  20. 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
  1. assume cs:code

  2. data segment
  3. db 'welcome to masm!',0                ;32B
  4. data ends

  5. stack segment
  6. dw 16 dup(0)                        ;32B
  7. stack ends

  8. code segment
  9. start:
  10.         mov ax,stack
  11.         mov ss,ax
  12.         mov sp,31
  13.        
  14.         mov dh,8
  15.         mov dl,3
  16.         mov cl,2
  17.         mov ax,data
  18.         mov ds,ax
  19.         mov si,0
  20.         call show_str
  21.         mov ax,4c00h
  22.         int 21h

  23. show_str:
  24.         push ds
  25.         push es
  26.         push si
  27.         push di
  28.         push ax
  29.         push bx
  30.         push cx
  31.         push dx
  32.        
  33.         ;求目标地址
  34.         mov ax,0b800h
  35.         mov es,ax
  36.         mov di,0
  37.        
  38.         mov ax,0
  39.         mov al,160
  40.         dec dh                        ;从0行开始计数
  41.         add dh,2                ;显存从第3行开始显示
  42.         mul dh
  43.         add di,ax

  44.         mov ax,0
  45.         mov al,2
  46.         dec dl
  47.         mul dl
  48.         add di,ax

  49.         mov ah,cl
  50.         mov cx,0

  51.         ;向目标地址写入数据       
  52. s:        mov cl,ds:[si]
  53.         jcxz show_str_ok
  54.         mov al,ds:[si]
  55.         mov es:[di],al
  56.         mov es:[di+1],ah
  57.         inc si
  58.         add di,2
  59.         jmp s

  60. show_str_ok:       
  61.         pop dx
  62.         pop cx
  63.         pop bx
  64.         pop ax
  65.         pop di
  66.         pop si
  67.         pop es
  68.         pop ds
  69.         ret       

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 22:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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