KK学脚本 发表于 2012-2-23 22:06:32

检测点6.1的第2个空 为什么是24H

(2)
assume cs:codesg
codesg segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
    dw 0,0,0,0,0,0,0,0,0,0
start:
    mov ax,cs   ;cs为所填第一空
    mov ss,ax
    mov sp,24h    ;此条指令为所填第二空
    mov ax,0
    mov ds,ax
    mov bx,0
    mov cx,8
s:
    push
    pop cs:    ;此条指令为所填第三空
    add bx,2
    loop s
   
    mov ax,4c00h
    int 21h
codesg ends
end start
本文来自:鱼C工作室<a href=http://www.fishc.com>详细出处参考:http://www.fishc.com/a/kehouti/_huibianyuyan_/839.html


http://bbs.fishc.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 KK学脚本的微博

KK学脚本 发表于 2012-2-23 22:07:51

本帖最后由 KK学脚本 于 2012-2-23 22:21 编辑

有没点 容易懂的看了小甲鱼的我还是不懂{:5_107:}


因为前边已经定义了8个字型数据,所以我们的栈空间是从数据段后开始的,所以栈空间偏移地址为16到35,所以我们的栈顶指针指向1a(即栈底的下一个元素)。


解释一下这个到底是什么意思

“所以栈空间偏移地址为16到35”
到底是什么意思

非同凡想 发表于 2012-2-23 23:42:06

codesg segment
   dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
   dw 0,0,0,0,0,0,0,0,0,0
首先,上述代码段中依次定义了18个字形数据,题目要求将后面的10个字形数据存储空间当作段来处理,所以栈顶偏移地址应为‘最后一个字型数据的地址+1’做为sp的值,即23h+1=24h。
重点要弄清楚前18个字型数据占用的内存空间为cs:00~cs:23h

莫名其妙 发表于 2012-2-24 14:09:04

本帖最后由 莫名其妙 于 2012-2-24 15:20 编辑

KK学脚本 发表于 2012-2-23 22:07 http://bbs.fishc.com/static/image/common/back.gif
有没点 容易懂的看了小甲鱼的我还是不懂




dw 字形数据   1个字形数据用两个 字节数据组成占16位
db 字节型数据 1个字节型数据 占8位

看图      这叫一个字 这叫一个字节   一个字是由两个字节组成的
                      \   /\/
0B15:0000CD 20 FF 9F 00 9A EE FE-1D F0 4F 03 79 05 8A 03

dw             0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h当你将这一段8个字形数据的数据存进内存以后这一段的偏移地址是多少?答案是从0到15   这个没问题吧
这正好是8个字形数据 拆成16个字节型数据存放在内存中(高八位在后低八位在前 )
然后 后面紧跟着就是dw 0,0,0,0,0,0,0,0,0,010个字形数据这一段数据进入内存以后 偏移地址是多少到多少? 16-35
这也是字型数据 也是24个字节型数据存放在内存中
0B15:000023 01 56 04 89 07 bc 0a - ef 0d ed 0f ba 0c 87 09   
    栈底→ 01   2    3   4   5   67   - 8910 11 12 13 14 15这一段偏移地址是0h--15h    
0B15:0010   00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
                  16 17 18 19 20 21 22 23-24 25 26 27 28 29 30 31   
0B15:002000 00 00 00 xx xx xx xx-xx xx xx xx xx xx xx xx   这一段偏移地址是10h--23h                 这一段是数据存放的
                   32 33 34 35 36 37 38
            这个就是栈顶↑ ↑这里就是栈顶指针指向的地方            
执行push 操作 栈顶指针先-2 ,然后将数据存入栈内.push 取DS段的数据按字型取放入栈顶
执行pop操作栈顶指针先+2然后取出数据存入指定位置或者寄存器,pop cs: 取出栈内数据放入 cs:中

mov ax,cs      
mov ss,ax
mov sp,24h      这个三段代码是将上面的所有数据全都放进栈里也就是这样确定一个栈的空间这个栈包含了35个字节
(十进制的35 按照16位计算下就是23H)
所以栈的指针sp 是指向栈顶的下一个单元 所以 sp要+1 也就是35+1=3636的16进制是24H



(@_@) 发表于 2012-9-12 05:32:31

{:7_169:}{:7_173:}{:7_178:}顶瓜瓜

肥马时代 发表于 2012-9-12 10:01:31

很简单的 要指向最后一个 0 的后面一个单元,前面一共18个dw 占据18*2=36个内存单元,换算成16进制=24h
页: [1]
查看完整版本: 检测点6.1的第2个空 为什么是24H