关于优化汇编代码的问题.........够囧,汇编也要优化

wendaosheyu 2008-11-24 11:49:12
一个非常实际的问题:
我写的那个程序需要判断大量的按键,也就是非常多的:
cmp al,扫描码
jz 标号
重新设置的INT 9,和系统的不一样,直接把扫描码放到内存里

我的解决方法是在一大堆判断按键的cmp和jz下面放一个表,先让jz跳到这个表里,然后再通过这个表跳到指定的位置
具体的代码是:
      s:mov al,cs:switch
mov dl,cs:pens
cmp al,48H
jz upt
cmp al,50H
jz downt
cmp al,4BH
jz leftt
cmp al,4DH
jz rightt
cmp al,20H
jz pendownt
cmp al,16H
jz penupt
cmp al,3BH
jz clst
cmp al,01H
jz exitt
jnz s
;-------判断按键
upt:jmp up
downt:jmp down
leftt:jmp left
rightt:jmp right
pendownt:jmp pendown
penupt:jmp penup
clst:jmp cls
exitt:jmp exit


感觉这种方法按键多了还是不行

我还想了一种方法:
记下jnz到下一条比较指令的机器码(jnz不是偏移寻址嘛,所以机器码都是一样的),然后用dw写jnz指令,省去标号的麻烦,这样:
cmp al,48H
dw jnz到下一cmp的机器码
jmp near ptr up
cmp al,50H
dw jnz到下一cmp的机器码
jmp near ptr down
cmp al,4BH
dw jnz到下一cmp的机器码
jmp near ptr left
cmp al,4DH
dw jnz到下一cmp的机器码
jmp near ptr right

哪个更好一点?大家还有没有什么别的方法?
...全文
123 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wendaosheyu 2008-11-24
  • 打赏
  • 举报
回复
忘了说主要的了
这么办主要是因为jz的偏移量太小了,中间隔的代码多了就跳不过去了
qdk0901 2008-11-24
  • 打赏
  • 举报
回复
thunk thunk
还是thunk

还是函数指针。
  • 打赏
  • 举报
回复
2楼的跳转表还可以优化一点:

.data
lookup_table label word
dw 4 ; number of entries
dw 48h, 50h, 4bh, 4dh ; key values
dw kb_up, kb_down, kb_left, kb_right ; procedure addresses

.code
.startup
xor ax,ax
lea di,lookup_table+2
mov al,cs:switch
mov cx,[di-2]
cld
repne scasw
jne @exit
mov bx,di
shl cx,1
sub bx,offset lookup_table
add di,cx
jmp [bx+di-4]
kb_up:
;
kb_down:
;
kb_left:
;
kb_right:
;
@exit:
;
ahjoe 2008-11-24
  • 打赏
  • 举报
回复
用跳转表
killbug2004 2008-11-24
  • 打赏
  • 举报
回复
第二种方法有创意,比第一种方法效率高点
xtdumpling 2008-11-24
  • 打赏
  • 举报
回复
可以做这样的一个jmp table:
.data
Fun_table label word
dw 48h,up
dw 50h,down
dw 4Bh,left
dw 4Dh,right
dw 0FFh
.code
.startup

lea edi,Fun_table
xor ah, ah
@@:
mov bx, word ptr [edi]
cmp bx, 0FFh
jz short @ext
mov si, word ptr [edi+2]
add edi,4
cmp ax, si
jnz @b
jmp word ptr [si]
up:
down:
left:
right:
@ext:

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧