我想知道如何更多地优化这些代码。现在他有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
如果您有任何建议请评论。 我刚开始学习装配。
答案 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
。为按键调用设置ah
到01h
时,您可以按照之前的02h
递减寄存器。您可以设置ax
,而不是分别设置ah
和al
。
如果我计算正确,这应该将实际的代码和数据字节从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