ExitProcess proto
AlphabetMatrix proto
Random64 proto
WriteString proto
.data
matrix byte 4 dup(0)
Rowsize = ($ - matrix)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
byte 4 dup(0)
alphabet byte 40 dup (0)
.code
main proc
mov rsi,offset matrix
mov rcx,3 ;rcx包括调用过程的次数
call AlphabetMatrix
mov ecx,0
call ExitProcess
main endp
AlphabetMatrix proc uses rax rbx rcx rdx rsi r8 r9 r10 r11 r12 r13 r14 r15
local data1:qword,data2:qword,data3:qword,data4:qword,data5:qword
mov r10,0;预设行索引为0
mov r9,0;预设行索引2为0
mov rdi,offset alphabet
L10:
push rcx
mov rcx,4
mov r11,0
mov r12,0
mov r13,0
mov r14,0
mov r15,0
mov data1,0
mov data2,0
mov data3,0
mov data4,0
mov data5,0
mov rsi,r10;设置行索引
J1:
push rcx
mov r8,0;预设列索引为0
mov rcx,4
L1:
push rcx
mov rbx,26
call Random64
mov rdx,0
div rbx;rdx为小于26的伪随机数
mov rbx,rdx;保存rdx在rbx
shr rdx,1;如果rdx为奇数则放入相应字母,如果是偶数则放入元音字母,如果有需求于L2处重新生成伪随机数
jc L2
cmp r8,0;因为这下面必然是元音字母,所以只要元音字母位于相应的列计数器加1,行同理,斜对角则根据列计数器和行计数器
;相等和列计数器为三,行计数器为0,列计数器递增,行计数器递减来判断
jne B1
inc r11
cmp rsi,3
jne B1
inc data5
B1:
cmp r8,1
jne B2
inc r12
cmp rsi,2
jne B2
inc data5
B2:
cmp r8,2
jne B3
inc r13
cmp rsi,1
jne B3
inc data5
B3:
cmp r8,3
jne C1
inc r14
cmp rsi,0
jne C1
inc data5
C1:
cmp rsi,0
jne C2
inc r15
C2:
cmp rsi,1
jne C3
inc data1
C3:
cmp rsi,2
jne C4
inc data2
C4:
cmp rsi,3
jne C5
inc data3
C5:
cmp rsi,r8
jne C6
inc data4
C6:
mov rbx,5
call Random64
mov rdx,0
div rbx
mov rcx,5;如果rdx为偶数则重新生成小于5的伪随机数rdx,如果新rdx为0,则放入A,如果新rdx为1则放入E,如果新rdx为2
;则为I,为3则为O,为4则为U
J3:
cmp rdx,0
jne J4
mov rbx,0
jmp L2
J4:
cmp rdx,1
jne J5
mov rbx,4
jmp L2
J5:
cmp rdx,2
jne J6
mov rbx,8
jmp L2
J6:
cmp rdx,3
jne J7
mov rbx,14
jmp L2
J7:
mov rbx,20
L2:
mov al,'A'
add al,bl
mov matrix[r8 + rsi*Rowsize],al
inc r8;增加列参数
pop rcx
dec rcx
jne L1
inc rsi;增加行参数
pop rcx
dec rcx
jne J1
add r10,4;将行参数设置在下一个矩阵的开头
cmp r11,2 ;计数器为2则出现出现元音字母的概率为50%
jne D1
mov rcx,4
mov rsi,0
V1:
mov al,matrix[rsi+r9*4]
add rsi,4
mov byte ptr [rdi],al
inc rdi
loop V1
D1:
cmp r12,2
jne D2
mov rcx,4
mov rsi,1
V2:
mov al,matrix[rsi+r9*4]
add rsi,4
mov byte ptr [rdi],al
inc rdi
loop V2
D2:
cmp r13,2
jne D3
mov rcx,4
mov rsi,2
V3:
mov al,matrix[rsi+r9*4]
add rsi,4
mov byte ptr [rdi],al
inc rdi
loop V3
D3:
cmp r14,2
jne E1
mov rcx,4
mov rsi,3
mov r8,r9
V4:
mov al,matrix[rsi+r9*4]
add rsi,4
mov byte ptr [rdi],al
inc rdi
loop V4
E1:
cmp r15,2
jne E2
mov rcx,4
mov r8,r9
imul r8,4
V5:
mov al,matrix[r8]
inc r8
mov byte ptr [rdi],al
inc rdi
loop V5
E2:
cmp data1,2
jne E3
mov rcx,4
V6:
mov al,matrix[r8]
inc r8
mov byte ptr [rdi],al
inc rdi
loop V6
E3:
cmp data2,2
jne E4
mov rcx,4
V7:
mov al,matrix[r8]
inc r8
mov byte ptr [rdi],al
inc rdi
loop V7
E4:
cmp data3,2
jne E5
mov rcx,4
V8:
mov al,matrix[r8]
inc r8
mov byte ptr [rdi],al
inc rdi
loop V8
E5:
cmp data4,2
jne E6
mov rcx,4
mov rsi,0
mov r8,r9
V9:
mov al,matrix[r8 * 4 + rsi]
inc r8
inc rsi
mov byte ptr [rdi],al
inc rdi
loop V9
E6:
cmp data5,2
jne E7
mov rcx,4
mov rsi,3
mov r8,r9
V10:
mov al,matrix[rsi+r8*4]
dec rsi
inc r8
mov byte ptr [rdi],al
inc rdi
loop V10
E7:
add r9,4 ;指向下一个矩阵
pop rcx
dec rcx
jne L10
mov rdx,offset alphabet
call WriteString
ret
AlphabetMatrix endp
end