注册 登录
编程论坛 汇编论坛

几个很简单的问题,自己想不出来。

admin_xyz 发布于 2012-06-26 00:27, 1065 次点击
1:
07D2H+10H 即 07E2H 是程序的地址。从07E2H开始,然后存放data段数据,stack段数据和code段数据。
data段数据空间是16B,stack占用空间是32B,由于编译器是从上往下编译的。然后07E2就是数据短的起始地址。stack段的起始地址就是07E2加上占用空间的16字节就是07E3了。所以07E3才是ss的段地址了!
红色字不理解,为什么07E2+16字节就万07E3了呢,07E2和07E3相差不是256个字节吗。
2:
程序代码:
assume cs:code,ss:stack,ds:data

data segment
      

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

data ends

stack segment
      

        dw 0,0,0,0,0,0,0,0

stack ends

code segment

start:
        mov ax,stack
        mov ss,ax
        mov sp,16

        mov ax,data
        mov ds,ax

        push ds:[0] ;这的ds为什么省略的话会编译错误,
;我以前可以省略的呀。
push [0] ;默认段地址不是在DS里面吗,为什么前面还要在加一个ds呢。
        push ds:[2]

        pop ds:[2]
        pop ds:[0]
      

        mov ax,4c00h
        int 21h

code ends

end start

9 回复
#2
zklhp2012-06-26 19:00
push ds:[0] ;这的ds为什么省略的话会编译错误,

masm的bug

mov ax, [1] 可能会被编译为mov ax, 1

前一个没看明白
#3
zklhp2012-06-26 19:05
段地址 07E2h 偏移量0 则物理地址 07E20h

段地址 07E3h 偏移量0 则物理地址 07E30h

差多少呢 差10h=16字节

顺便 B是 byte 还是bit啊 我不知道 你查查呗 别写错了
#4
zklhp2012-06-26 19:07
对了 大写的B是Byte 小写的b是bit
#5
于祥2012-06-27 09:58
堆栈的看不懂
#6
heliang62912012-06-28 14:35
1.解说中是段地址,段地址在表达实际地址时是*16的关系;
2.这个是编译器的问题,无需多研究,按它的限制使用就是了,无需浪费时间研究这个。平时[data]默认是在DS中的。
#7
admin_xyz2012-06-28 19:53
谢谢版主,第一个问题我搞明白了,物理地址可以用多种 段地址*10h+偏移 组成。

以前还清楚的。。。
#8
宋末2012-07-22 21:41
masm不认识【0】你可以【AX]
#9
爱末流2012-08-02 23:43
push ds:[0] ;这的ds为什么省略的话会编译错误,
 在16汇编下 push不支持立即数, push ds:[0] 不加 ds 也许 masm将他汇编成 push 0 这样了。在debug下调试就可以看见
 王爽的书上面说的很清楚。
 
#10
爱末流2012-08-02 23:45
回复 8楼 宋末
[ax] 不能作为寻址。在 32位汇编才支持  16位汇编 寻址有 [di][si][eb][bx]
1