单纯的+c 发表于 2017-4-17 21:27:20

一个关于mov 和push pop的各方面的疑惑

本帖最后由 单纯的+c 于 2017-4-19 08:35 编辑

assume cs:codesg

codesg segment

start:        mov bx, 0
                                mov cx, 12
                                mov ax, 0ffffH
                                mov ds, ax
                                mov ax, 0020H
                                mov es, ax
                               
s:                        push
                                pop
                                inc bx
                                loop s
                               
                                mov ax,4C00H
                                int 21H
                               
codesg ends

end start

assume cs:codesg

codesg segment

start:        mov bx, 0
                                mov cx, 12
                                mov ax, 0ffffH
                                mov ds, ax
                                mov ax, 0020H
                                mov es, ax
                               
s:                        mov dl, ds:
                                mov es:, dl
                                inc bx
                                loop s
                               
                                mov ax,4C00H
                                int 21H
                               
codesg ends

end start
以上两个是关于把某段内存的数据copy到另一段内存的代码
在代码的循环那里,数据中转用栈的效率比较高
还是用一个寄存器的效率比较高?
这两者如果遇到大数据的话
谁会比较优势?

单纯的+c 发表于 2017-4-17 21:29:30

@小甲鱼

yongtaige 发表于 2017-4-18 14:03:51

当然是用寄存器效率高,程序慢体现在CPU对内存的读写。
在一次循环中:
如果用寄存器涉及2次内存读写,第一次是将内存的数据读入寄存器,第二次将寄存器的内容写入内存
如果用栈涉及4次内存读写,栈也是在内存中的一段空间,第一次是将内存的数据读入指令存储器,第二次将数据从指令存储器的内容写入栈;第三次将栈内容出栈到指令存储器,第四次将数据写入目标内存
还有你第一段程序有一堆问题
   1、pop 没有标明es段地址
以下问题虽然对本程序结果没有影响,但是编程习惯还是要注意以下的
   2、没有定义栈段
   3、栈每次操作2个字节数据,所以 inc bx要改成 add bx, 2
   4、mov cx, 12 这个赋值要紧贴着循环

单纯的+c 发表于 2017-4-19 08:35:01

yongtaige 发表于 2017-4-18 14:03
当然是用寄存器效率高,程序慢体现在CPU对内存的读写。
在一次循环中:
如果用寄存器涉及2次内存读写,第 ...

明白了,谢谢大神解答,以后会注意的,谢谢
页: [1]
查看完整版本: 一个关于mov 和push pop的各方面的疑惑