鱼C论坛

 找回密码
 立即注册
查看: 2597|回复: 7

一直想不通偏移地址怎么算出来的?请教

[复制链接]
发表于 2013-1-29 10:49:37 | 显示全部楼层 |阅读模式
1鱼币
下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:
  1. assume cs:codesg

  2. codesg segment

  3.         dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

  4.         dw 0,0,0,0,0,0,0,0,0,0

  5. start:  mov ax, codesg ;或mov ax, cs

  6.         mov ss,ax

  7.         mov sp, 24h    ;或mov sp, 36     ;(第一版填1ah或26)

  8.         mov ax,0

  9.         mov ds,ax

  10.         mov bx,0

  11.         mov cx,8

  12.     s:  push [bx]

  13.          pop cs:[bx]   ;或 pop ss:[bx]

  14.         add bx,2  

  15.         loop s

  16.         mov ax,4c00h

  17.         int 21h

  18. codesg ends

  19. end start
复制代码
问题1, mov ax, codesg ;或mov ax, cs 怎么理解??
问题2,mov sp, 24h ;或mov sp, 36 ;(第一版填1ah或26)中,24h想不通。

最佳答案

查看完整内容

1.可以 2. 0:0~15单元 指的是段地址为0,偏移为0的地址 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h dw 0,0,0,0,0,0,0,0,0,0 这两个都是CS段中的,不是0:0-0:15的那段内存,完全没关系 还有你说的那个不能叫溢出,应该叫不符合题目要求
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-29 10:49:38 | 显示全部楼层

1.可以
2.
0:0~15单元 指的是段地址为0,偏移为0的地址
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0
这两个都是CS段中的,不是0:0-0:15的那段内存,完全没关系
还有你说的那个不能叫溢出,应该叫不符合题目要求
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-29 11:31:05 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-29 12:09 编辑

问题1:mov ax, codesg ;或mov ax, cs
cs:codesg
这句把CS和codesg挂钩也就是说CS寄存器的值=codesg的地址
至于具体CS值为多少,这是不确定的,反正那段地址是安全的
所以,mov ax,codesg等于与mov ax,cs
理由:mov ax,codesg中,codesg就是codesg segment的首地址,cs的值同样也是

问题2:mov sp, 24h ;或mov sp, 36
其实SP栈顶指针代表的就是这个栈的大小
栈需要大点,不然push一次SP栈顶指针需要减2
如果栈顶SP=0,再减2,就会变成FFFE
这样会出问题的。
所以栈要够我们push

也就是说大点没关系,不要太大不然浪费(太大不知道会不会出问题。)



对了差点无视你的标题
偏移地址是把
具体看代码注释

  1. assume cs:codesg

  2. codesg segment
  3. ;因为地址是难以确定的,
  4. ;偏移一般是靠寄存器动态计算的
  5. ;我们这里地址都用假设的
  6. ;;假设这里地址为1234H,作为首地址
  7. dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h;占16个字节
  8. dw 0,0,0,0,0,0,0,0,0,0 ;占20个字节
  9. ;上面一共占36个字节,十六进制是24H

  10. start: mov ax, codesg ;前面一共占24H个字节,所以mov ax,codesg距离首地址24H,所以偏移是24H
  11. ;所以地址这样表示1234H:24H

  12. mov ss,ax;mov ax,codesg占3个字节,也就是说mov ss,ax距离我们首地址24H+3个字节
  13. ;所以偏移地址是27H,那么地址就是这样表示1234H:27H

  14. mov sp, 24h ;mov ss,ax占2个字节,也就是说mov ss,ax距离我们首地址27H+2个字节
  15. ;所以偏移地址是29H,那么地址就是这样表示1234H:29H
  16. mov ax,0 ;mov sp, 24h 占3个字节,也就是说mov ss,ax距离我们首地址29H+3个字节
  17. ;所以偏移地址是2CH,那么地址就是这样表示1234H:2CH

  18. mov ds,ax
  19. ;以此类推了

  20. mov bx,0

  21. mov cx,8

  22. s: push [bx]

  23. pop cs:[bx] ;或 pop ss:[bx]

  24. add bx,2

  25. loop s

  26. mov ax,4c00h

  27. int 21h

  28. codesg ends

  29. end start
复制代码


至于如果看一个指令占多少个字节
我是用DEBUG用-u指令查看
1.jpg
如果可以看到mov ax,18BA的机器码是B8BA18
B8一个字节 BA一个 18一个
一共三个
所以mov ax,18BA占三个字节
下面 mov ss,ax
8E一个 D0一个
所以mov ss,ax占2个字节


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-29 12:38:44 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-1-29 11:31
问题1:mov ax, codesg ;或mov ax, cs
cs:codesg
这句把CS和codesg挂钩也就是说CS寄存器的值=codesg的地 ...

说得很周到,还遗有疑问:
1,代码中
  1. dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  2. dw 0,0,0,0,0,0,0,0,0,0
复制代码
可以写在一行上吗:
  1. dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h,0,0,0,0,0,0,0,0,0,0
复制代码
2,按照题目,“实现依次用内存0:0~0:15单元中的内容改写程序中的数据 ”,程序中数据有36字节,内存只有16个单元16个字节,不是溢出了吗?谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-29 22:32:19 | 显示全部楼层
好多神人啊,努力学习去
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-29 23:11:03 | 显示全部楼层

RE: 一直想不通偏移地址怎么算出来的?请教

遒羽 发表于 2013-1-29 12:38
说得很周到,还遗有疑问:
1,代码中可以写在一行上吗:
2,按照题目,“实现依次用内存0:0~0:15单元中 ...

1.在理论上是可以的,所谓的栈段是人们对这段内存强加的理解,cpu只会对ss ip有反应
所以理论上可行,重点是如果让别人读代码的时候就会莫名其妙了!!!!
2.题目的意思是让我们达到将0:0  到0:15的数据覆盖程序第一个dw中的16个字节的内容,所以不会溢出
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-30 09:05:17 | 显示全部楼层
shansongh 发表于 2013-1-29 23:11
1.在理论上是可以的,所谓的栈段是人们对这段内存强加的理解,cpu只会对ss ip有反应
所以理论上可行,重 ...

谢谢shansongh!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-3 12:43:37 | 显示全部楼层
好东西,顶一
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 23:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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