我如何更多地优化此代码? [大会8086字母金字塔]

时间:2014-12-07 14:33:05

标签: optimization assembly x86

我想知道如何更多地优化这些代码。现在他有467k和59线。

数据段:

code_char db 'A'
counter_space db 39
counter_char dw 1
counter_rows dw 25

计划细分:

rows:

mov cl, counter_space ;here I write space
mov ah,02h
mov dl,''
space:
int 21h
loop space

mov cx, counter_char ;here I write letters
mov ah,02h
mov dl,code_char
letters:
int 21h
loop letters

mov ah,02h   ;here I go to another line(enter)
mov dl,0ah
int 21h

INC code_char    ;here I change the value of variable's
DEC counter_space
ADD counter_char,2
DEC counter_rows

mov cx,counter_rows ;here I count the rows to 25 
loop rows

mov ah,01h ;here I w8 to any key
int 21h

            mov     ah,4ch
            mov     al,0
            int     21h

如果您有任何建议请评论。 我刚开始学习装配。

1 个答案:

答案 0 :(得分:0)

您可以利用所有其他变量都可以从counter_rows变量计算的事实,因此您实际上只需要一个变量:

code_char     = 'A' + 25 - counter_rows
counter_space = counter_rows + 14
counter_char  = 51 - counter_rows * 2

由于counter_rows是你的外循环计数器,你可以一直将它保存在寄存器中,而不是为它分配内存。这样就可以在没有任何内存引用的情况下运行程序。

还可以做一些其他的小优化。除第一次通话外,您不需要将ah注册设置为02h。为按键调用设置ah01h时,您可以按照之前的02h递减寄存器。您可以设置ax,而不是分别设置ahal

如果我计算正确,这应该将实际的代码和数据字节从59减少到41:

mov bx, 25 ;counter_rows
rows:

  ;here I write space
  mov cx, bx ; counter_space = counter_rows + 14
  add cl, 14
  mov ah, 02h
  mov dl, 32 ;space
  space:
    int 21h
  loop space

  ;here I write letters
  mov cl, 51 ;counter_char = 51 - counter_rows * 2
  sub cl, bl
  sub cl, bl
  ;mov ah, 02h - already set
  mov dl, 65 + 25 ;code_char = 'A' + 25 - counter_rows
  sub dl, bl
  letters:
    int 21h
  loop letters

  ;here I go to another line(enter)
  ;mov ah, 02h - already set
  mov dl, 0ah
  int 21h

  dec bx
jnz rows

;here I wait for any key
dec ah ;02h - 1 = 01h
int 21h

mov ax,4c00h ;set ah and al in one go
int 21h