.model small.stack 100h.data message db '欢迎来到打字游戏!$' prompt db '请键入字母: $' correct db '正确!$' wrong db '错误!$' exitMsg db '退出游戏。$' newline db 0Dh, 0Ah, '$'.codemain proc mov ax, @data mov ds, ax mov ah, 9 lea dx, message int 21h mov cx, 0 ; 正确字符计数 mov dx, 0 ; 错误字符计数 input_loop: mov ah, 9 lea dx, prompt int 21h mov ah, 1 int 21h ; 从键盘读取输入的字符 cmp al, 'q' je exit_game ; 如果输入的是 'q',则退出游戏 cmp al, 'a' jl input_loop ; 如果输入的字符小于 'a',则重新输入 cmp al, 'z' jg input_loop ; 如果输入的字符大于 'z',则重新输入 cmp al, bl ; 比较输入的字符和随机生成的字符 je correct_input ; 如果相等,则显示正确消息 jmp wrong_input ; 否则显示错误消息 correct_input: inc cx ; 正确字符计数加一 mov ah, 2 mov dl, bl int 21h ; 显示正确的字符 mov ah, 9 lea dx, correct int 21h ; 显示“正确!”消息 jmp next_input wrong_input: inc dx ; 错误字符计数加一 mov ah, 2 mov dl, bl int 21h ; 显示正确的字符 mov ah, 9 lea dx, wrong int 21h ; 显示“错误!”消息 next_input: ; 统计结果并显示 mov ah, 9 lea dx, newline int 21h mov ah, 2 mov dl, '正' int 21h mov dl, '确' int 21h mov dl, ' ' int 21h mov dl, '字' int 21h mov dl, '符' int 21h mov dl, ':' int 21h mov ax, cx call print_number ; 显示正确字符个数 mov dl, ' ' int 21h mov dl, '错' int 21h mov dl, '误' int 21h mov dl, ' ' int 21h mov dl, '字' int 21h mov dl, '符' int 21h mov dl, ':' int 21h mov ax, dx call print_number ; 显示错误字符个数 ; 计算正确率 mov ah, 9 lea dx, newline int 21h mov ah, 2 mov dl, '正' int 21h mov dl, '确' int 21h mov dl, ' ' int 21h mov dl, '确' int 21h mov dl, '率' int 21h mov dl, ':' int 21h xor ax, ax mov bx, dx ; 错误字符个数 cmp bx, ax je skip_division ; 如果错误字符个数为零,则不进行除法运算 div bx ; ax = cx / bx call print_number ; 显示正确率 skip_division: ; 等待用户按下任意键继续 mov ah, 9 lea dx, newline int 21h mov ah, 9 lea dx, exitMsg int 21h mov ah, 1 int 21h jmp input_loop ; 继续下一次输入循环 exit_game: mov ah, 4Ch int 21hprint_number proc push bx mov bx, 10 xor cx, cx div bx push ax cmp dl, 0 je end_printing call print_number pop ax add dl, '0' mov ah, 2 int 21h end_printing: pop bx add dl, '0' mov ah, 2 int 21h retprint_number endpend main
请注意,上述代码是基于DOS的8086汇编语言,您需要使用适当的汇编器和链接器来运行该代码。此外,由于汇编语言更复杂和底层,所以代码要比使用高级语言编写的版本更长并且更复杂。