2013-03-10 12:19:32Morris
[組合語言][練習] 九九乘法表
練習使用 for 迴圈,同時使用兩層 for 迴圈的操作。
會發現 jump 的指令不能跳躍太多行,網路上查是 -128-127,應該是 byte 為單位的指令長度。
使用 push 暫存第一個迴圈的值,第二個迴圈結束後,在 pop 回來,並且 jump 回去。
TITLE table
INCLUDE Irvine32.inc
.data
x db ?
y db ?
z db ?
str1 db "*", 0
str2 db "=", 0
newline db 0dh, 0ah, 0
.code
main PROC
mov ecx, 9 ; i = 9
mov x, 1 ; x = 1
fori:
mov y, 1 ; y = 1
push ecx ; store i
mov ecx, 9 ; j = 9
forj:
mov al, x
mul y ; AL = AL*y
mov z, al ; z = al
mov al, ' '
call WriteChar
mov eax, 0
movzx ax, y ;
call WriteDec
mov edx, OFFSET str1 ; print " * "
call WriteString
movzx ax, x ;
call WriteDec
mov edx, OFFSET str2 ; print " = "
call WriteString
movzx ax, z ;
call WriteDec
inc y ; y++
loop forj
mov edx, OFFSET newline ; print "\n"
call WriteString
pop ecx
inc x
loop fori
ret
main ENDP
END main
會發現 jump 的指令不能跳躍太多行,網路上查是 -128-127,應該是 byte 為單位的指令長度。
使用 push 暫存第一個迴圈的值,第二個迴圈結束後,在 pop 回來,並且 jump 回去。
TITLE table
INCLUDE Irvine32.inc
.data
x db ?
y db ?
z db ?
str1 db "*", 0
str2 db "=", 0
newline db 0dh, 0ah, 0
.code
main PROC
mov ecx, 9 ; i = 9
mov x, 1 ; x = 1
fori:
mov y, 1 ; y = 1
push ecx ; store i
mov ecx, 9 ; j = 9
forj:
mov al, x
mul y ; AL = AL*y
mov z, al ; z = al
mov al, ' '
call WriteChar
mov eax, 0
movzx ax, y ;
call WriteDec
mov edx, OFFSET str1 ; print " * "
call WriteString
movzx ax, x ;
call WriteDec
mov edx, OFFSET str2 ; print " = "
call WriteString
movzx ax, z ;
call WriteDec
inc y ; y++
loop forj
mov edx, OFFSET newline ; print "\n"
call WriteString
pop ecx
inc x
loop fori
ret
main ENDP
END main