453
技术社区[云栖]
[原创]汇编初学者问题合集
上次有兄弟问关于 指令时间的问题,答复查看 intel 手册是一个办法。
但很多人没有那个东东吧!,所以可以用另一招,在编译时加入 /Sc
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
retf
code ends
end start
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 个时钟周期。
***************************
MOV AX,0ABC
DEC AX
AND AX,00FFH
MOV CL,4
SAL AL,1
***************************
当输入到 sal al,1 时提示error
shl 与 sal 作用是完全一样的,所以在编译的时候自动将
sal 转换成了 shl .使用sal dubug 不识别,换成shl就搞定了。
可以把上述代码编译成 EXE 文件,然后用debug 中 u 指令查看,
结果 sal 的地方 被换成 shl。
36 * 10 = 36 * (8 + 2) = 36 * 8 + 36 * 2
即等于:
24h * 8 + 24h * 2
4 察看 debug 状态寄存器
of(溢出) df(方向) if(中断) sf(符号) zf(零) af(辅助进位) pf(奇偶) cf(进位)
为一的时候
ov(OVerflow) dn(DowN) ei(Enable Interrupt) ng(NeGtive) zr(ZeRo) ac(Auxiliary Carry) pe(Parity Even) cy(CarrY)
为零的时候
nv(Not oVerflow) up(UP) di(DIsable interrupt) pl(PLus) nz(Not Zero) na(Not Auxiliary) po(Parity Odd) nc(Not Carry)
(masm611下载地址: www.aogosoft.com,masm32下载地址
最后更新:2017-04-02 00:06:21