几个简单的汇编初学者问题总结
0 关于指令时间的问题上次有兄弟问关于 指令时间的问题,答复查看 intel 手册是一个办法。
但很多人没有那个东东吧!,所以可以用另一招,在编译时加入 /Sc
选项:
ML /Fl /Sc Kinds.asm
还有有位兄弟问过 为什么 mov ax,offset table 比 lea ax,table 速度
要快?但到底快到什么程度,恐怕也没法感性认识。下面让偶们来
看看实际效果:
首先在源文件 Kinds.asm 中敲入:
data segment
tabledw?
data ends
code segment
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,offset table
lea ax,table
idiv table
retf
code ends
end start
保存后,控制台中敲入:
ML /Fl /Sc Kinds.asm
完成后,在同一目录下用记事本打开 Kinds.lst 文件:
0000 datasegment
0000 0000 tabledw?
0002 dataends
0000 codesegment
assume cs:code,ds:data
0000start:
0000 10 1Epushds
0001 3 2B C0 subax,ax
0003 11 50 pushax
0004 4 B8 ---- Rmovax,data
0007 2 8E D8 movds,ax
0009 4 B8 0000 Rmovax,offset table
000C 8 8D 06 0000 R leaax,table
0010 177+ F7 3E 0000 R idivtable
0014 26 CB retf
0015 codeends
endstart
可以清楚地看到 :
mov ds,ax 只需要 2个时钟周期
mov ax,offset table 需要 4个
lea ax,table 则需要 8 个
而 idiv table 更是夸张的用到了超过 177 个时钟周期。
是不是一目了然呢?呵呵!
但很多人没有那个东东吧!,所以可以用另一招,在编译时加入 /Sc
选项:
ML /Fl /Sc Kinds.asm
还有有位兄弟问过 为什么 mov ax,offset table 比 lea ax,table 速度
要快?但到底快到什么程度,恐怕也没法感性认识。下面让偶们来
看看实际效果:
首先在源文件 Kinds.asm 中敲入:
data segment
tabledw?
data ends
code segment
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,offset table
lea ax,table
idiv table
retf
code ends
end start
保存后,控制台中敲入:
ML /Fl /Sc Kinds.asm
完成后,在同一目录下用记事本打开 Kinds.lst 文件:
0000 datasegment
0000 0000 tabledw?
0002 dataends
0000 codesegment
assume cs:code,ds:data
0000start:
0000 10 1Epushds
0001 3 2B C0 subax,ax
0003 11 50 pushax
0004 4 B8 ---- Rmovax,data
0007 2 8E D8 movds,ax
0009 4 B8 0000 Rmovax,offset table
000C 8 8D 06 0000 R leaax,table
0010 177+ F7 3E 0000 R idivtable
0014 26 CB retf
0015 codeends
endstart
可以清楚地看到 :
mov ds,ax 只需要 2个时钟周期
mov ax,offset table 需要 4个
lea ax,table 则需要 8 个
而 idiv table 更是夸张的用到了超过 177 个时钟周期。
是不是一目了然呢?呵呵!