鱼C论坛

 找回密码
 立即注册
查看: 3152|回复: 8

[已解决]新人求解一点汇编疑问关于寄存器的

[复制链接]
发表于 2015-10-11 13:35:33 | 显示全部楼层 |阅读模式

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

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

x
刚刚这两天在学小甲鱼哥哥的汇编第三章时遇到了点问题,麻烦各位大神给个指点:
首先关于数据段:
我自己尝试后发现设置好了段码后,不过是数据区的短码“DS”,还是指令区的段码“CS”,不管数据区如何改变,就算溢出进位,段码区也不会改变,那岂不是在编程时最多只能写64Kb的数据或指令就得再次改变段码?
还有就算关于“栈”,假如我打算设”1000H-100fH“为栈段,我设置“sp“为“0010”,然后一步步push,当减到”0“时直接下一个”fffe“,而不是”0010“,难道栈不能循环重置吗。
最佳答案
2015-10-16 11:45:31
assume cs:codesg,ds:datasg,ss:stack
datasg segment
     dw 123h,234h,345h,456h,567h,678h,789h,890h
datasg ends
stack segment
     dw 8 dup(0)     
stack ends
codesg segment
start:mov ax,datasg
      mov ds,ax
      mov ax,stack
      mov ss,ax
      mov sp,16
     push ax
       push ax
     push ax
     push ax
     push ax
     push ax
     push ax
     mov ax,4c00h
     int 21h
codesg ends
end start     
在单步执行到第六次push后,查看data段,数据没有被改变。
根据王爽老师的汇编语言第二版教材,第十二,十三章,
我知道了单步操作是中断,要进行压栈操作。pushf.
push cs,push ip
这是进行了三次压栈操作。可是在程序中,在进行第七次压栈时
直接无效操作。给踢出程序了。
如果把dw 8 dup(0)给改为6,那么第五次压栈操作时就给踢出去了。
但是,数据段的内容并没有改变。


进行第七次压栈时。




     



这是进行第三次压操作后,栈段的数据,那么第四次压栈就应该会溢出了。
那么我的问题就是,单步操作要进行三次压栈,另外的两个字的内容是被什么操作
改变的。溢出的数据存在了那儿。是存在了13c7:fffe 开始的地方了吗。
如果程序修改下。
assume cs:codesg,ds:datasg
datasg segment
     dw 123h,234h,345h,456h,567h,678h,789h,890h

     dw 8 dup(0)     
datasg ends
codesg segment
start:mov ax,datasg
      mov ds,ax
      mov ss,ax
      mov sp,32
     push ax
       push ax
     push ax
     push ax
     push ax
     push ax
     push ax
     mov ax,4c00h
     int 21h
codesg ends
end start
在第四次压栈操作时,数据就被改变。但是程序能完成。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-11 17:54:30 | 显示全部楼层
关于栈的,0-2肯定给SP置成fffe.因为这个是按寻址范围来算的,cpu没有那么智能。
64k已经很大了,如果写的程序很长,肯定要分成多个子程序来写的。要不看都看不懂了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-11 18:00:36 | 显示全部楼层
段代码可以通过跳转来改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-14 10:29:22 | 显示全部楼层
学习学习,汇编语言有点难哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-14 12:01:20 | 显示全部楼层
栈还不是太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-16 11:42:21 | 显示全部楼层
后面一直在讲栈,这个必须懂。定义栈时要多定义点,不能用到多少就定义多长,这样肯定会溢出。因为在单步操作中,要用到五个字的长度的栈段。如果栈段和数据段在一个段内,那么数据段中的数据会被冲。如果不在一个段内,程序会异常结束。栈段的寻址范围为SS:0000-SS:0ffff.溢出的数据会循环存放。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-16 11:45:31 | 显示全部楼层    本楼为最佳答案   
assume cs:codesg,ds:datasg,ss:stack
datasg segment
     dw 123h,234h,345h,456h,567h,678h,789h,890h
datasg ends
stack segment
     dw 8 dup(0)     
stack ends
codesg segment
start:mov ax,datasg
      mov ds,ax
      mov ax,stack
      mov ss,ax
      mov sp,16
     push ax
       push ax
     push ax
     push ax
     push ax
     push ax
     push ax
     mov ax,4c00h
     int 21h
codesg ends
end start     
在单步执行到第六次push后,查看data段,数据没有被改变。
根据王爽老师的汇编语言第二版教材,第十二,十三章,
我知道了单步操作是中断,要进行压栈操作。pushf.
push cs,push ip
这是进行了三次压栈操作。可是在程序中,在进行第七次压栈时
直接无效操作。给踢出程序了。
如果把dw 8 dup(0)给改为6,那么第五次压栈操作时就给踢出去了。
但是,数据段的内容并没有改变。


进行第七次压栈时。




     



这是进行第三次压操作后,栈段的数据,那么第四次压栈就应该会溢出了。
那么我的问题就是,单步操作要进行三次压栈,另外的两个字的内容是被什么操作
改变的。溢出的数据存在了那儿。是存在了13c7:fffe 开始的地方了吗。
如果程序修改下。
assume cs:codesg,ds:datasg
datasg segment
     dw 123h,234h,345h,456h,567h,678h,789h,890h

     dw 8 dup(0)     
datasg ends
codesg segment
start:mov ax,datasg
      mov ds,ax
      mov ss,ax
      mov sp,32
     push ax
       push ax
     push ax
     push ax
     push ax
     push ax
     push ax
     mov ax,4c00h
     int 21h
codesg ends
end start
在第四次压栈操作时,数据就被改变。但是程序能完成。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-16 11:47:45 | 显示全部楼层
为什么会是五个字的内容,不是三个的,我没找到原因。图就不发了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-16 11:49:58 | 显示全部楼层
可以用d xxxx:xxxx xxxx   自己去看的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-19 04:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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