汇编语言生成4*4矩阵出现元音字母的概率为50%,显示每一行,每一列,每个对角线中有两个元音字母的字母组(注释比较粗糙)

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 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值