鱼C论坛

 找回密码
 立即注册
查看: 1965|回复: 9

一个问题

[复制链接]
发表于 2013-1-22 15:34:49 | 显示全部楼层 |阅读模式

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

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

x
红字处的语句为什么不合法啊??求解

assume cs:code
d segment

        db 0,0,0,0,0,0,0,0,

d ends
a segment

        db 1,2,3,4,5,6,7,8

a ends

b segment

        db 1,2,3,4,5,6,7,8

b ends



code segment

start:

        mov ax,a

        mov ds,ax

        mov ax,b

        mov es,ax

        mov ax,d

        mov ss,ax

        mov bx,0

        mov cx,8

s:     
       add ss:[bx],es:[bx]
        add ss:[bx],ds:[bx]


        inc bx

        loop s

        mov ax,4c00h

        int 21h

code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-22 16:01:50 | 显示全部楼层
本帖最后由 54085256 于 2013-1-22 16:36 编辑

任意时刻,SS:SP指向栈顶元素

assume cs:code
d segment
db 0,0,0,0,0,0,0,0
d ends
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends

code segment
start:  mov ax,a
mov ds,ax
mov ax,b
mov es,ax
mov ax,d
mov ss,ax
mov sp,0
mov bx,0
mov cx,8
s:  push es:[bx]
     push ds:[bx]
     pop ds:[bx]
     pop es:[bx]
inc bx
loop s
  
  
  mov ax,4c00h
  int 21h
  
  code ends
  
  end start


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-1-22 16:20:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-22 16:26:17 | 显示全部楼层
本帖最后由 54085256 于 2013-1-22 16:30 编辑

SS 只能用 push pop

SS 是栈的段地址
栈是具有特殊的访问方式
改下编译试试

你过没过我不知道,反正我是过了



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-22 16:37:23 | 显示全部楼层
ADD指令不能同时为两个内存操作数!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-1-22 16:51:46 | 显示全部楼层
s0512 发表于 2013-1-22 16:37
ADD指令不能同时为两个内存操作数!

thankyou~~求教为什么:loveliness:。是cpu的限制,还是有什么内在机理?

评分

参与人数 1鱼币 +2 收起 理由
s0512 + 2 热爱鱼C^_^!!同学加油!!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-1-22 16:52:31 | 显示全部楼层
54085256 发表于 2013-1-22 16:26
SS 只能用 push pop

SS 是栈的段地址

灰常感谢{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-22 17:15:28 | 显示全部楼层
刘金伟 发表于 2013-1-22 16:51
thankyou~~求教为什么。是cpu的限制,还是有什么内在机理?

这个是出于效率方面的考虑。英特尔在设计芯片时就没支持这种内存到内存的ADD操作。
因为进行内存操作效率远比不上进行寄存器操作。
从内存取的数是放在寄存器中,从寄存器中再放回到内存中,如果用一条指令完成,
就需要进行2次存储器读写操作,这样就造成一条指令的效率太低。所以就干脆不支持。
COPY~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-1-22 17:32:18 | 显示全部楼层
s0512 发表于 2013-1-22 17:15
这个是出于效率方面的考虑。英特尔在设计芯片时就没支持这种内存到内存的ADD操作。
因为进行内存操作效率 ...

{:7_168:}好详细!!明白了~~~~thankyou~~~!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-25 19:29:37 | 显示全部楼层
源操作数和目的操作数不能是寄存器间接寻址,也就是目的和源操作数必须有一个寄存器。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-7 22:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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