刘金伟 发表于 2013-1-22 15:34:49

一个问题

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

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:,es:
      add ss:,ds:

      inc bx

      loop s

      mov ax,4c00h

      int 21h

code ends

end start

54085256 发表于 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:
   push ds:
   pop ds:
   pop es:
inc bx
loop s


mov ax,4c00h
int 21h

code ends

end start


刘金伟 发表于 2013-1-22 16:20:26

54085256 发表于 2013-1-22 16:01 static/image/common/back.gif
任意时刻,SS:SP指向栈顶元素

关键我没用栈啊,只是用了ss寄存器而已

54085256 发表于 2013-1-22 16:26:17

本帖最后由 54085256 于 2013-1-22 16:30 编辑

SS 只能用 push pop

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

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



s0512 发表于 2013-1-22 16:37:23

ADD指令不能同时为两个内存操作数!

刘金伟 发表于 2013-1-22 16:51:46

s0512 发表于 2013-1-22 16:37 static/image/common/back.gif
ADD指令不能同时为两个内存操作数!

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

刘金伟 发表于 2013-1-22 16:52:31

54085256 发表于 2013-1-22 16:26 static/image/common/back.gif
SS 只能用 push pop

SS 是栈的段地址


灰常感谢{:1_1:}

s0512 发表于 2013-1-22 17:15:28

刘金伟 发表于 2013-1-22 16:51 static/image/common/back.gif
thankyou~~求教为什么。是cpu的限制,还是有什么内在机理?

这个是出于效率方面的考虑。英特尔在设计芯片时就没支持这种内存到内存的ADD操作。
因为进行内存操作效率远比不上进行寄存器操作。
从内存取的数是放在寄存器中,从寄存器中再放回到内存中,如果用一条指令完成,
就需要进行2次存储器读写操作,这样就造成一条指令的效率太低。所以就干脆不支持。
COPY~~

刘金伟 发表于 2013-1-22 17:32:18

s0512 发表于 2013-1-22 17:15 static/image/common/back.gif
这个是出于效率方面的考虑。英特尔在设计芯片时就没支持这种内存到内存的ADD操作。
因为进行内存操作效率 ...

{:7_168:}好详细!!明白了~~~~thankyou~~~!!!

n2zee 发表于 2013-1-25 19:29:37

源操作数和目的操作数不能是寄存器间接寻址,也就是目的和源操作数必须有一个寄存器。
页: [1]
查看完整版本: 一个问题