汇编 nasm 打字板

今年期末老师要求我们完成一个简单的汇编课设。我实现了一个打字版,以下的代码 

org 0x8400

jmp start

;welcomeStr db 'WELCOME YOU YOU 0'
;字符串格式,英文字库格式
welcomeStr db 'W', 'E', 'L', 'C', 'O', 'M', ' ', 'Y', 'O', 'U', 0,
nextStepStr db 'P','R','E','S','S',' ','K','E','Y',' ','T','O',' ','N','E','X','T',' ','S','T','E','P', 0,
aStepStr db 'A',' ','S','H','O','W',' ','I','M','G', 0,
bStepStr db 'B',' ','O','U','T','P','U','T',' ','K','E','Y','B','O','A','R','D', 0,
helloWorldStr db 'H','E','L','L','O',' ','W','O','R','L','D', 0, 


;字符矩阵,0不打点,1打点,2矩阵结束,3行末标识
charA db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,2,


charB db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,2,


charC db 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,2,


charD db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,2,


charE db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,2,


charF db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,2,


charG db 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,3,
      db 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,2,


charH db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,2,


charI db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,2,


charJ db 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,2,


charK db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,2,


charL db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,2,


charM db 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1,3,
      db 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1,3,
      db 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1,3,
      db 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1,3,
      db 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1,3,
      db 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1,3,
      db 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1,3,
      db 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1,2,


charN db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,2,


charO db 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,2,


charP db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,2,


charQ db 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0,3,
      db 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0,2,


charR db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,2,


charS db 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,3,
      db 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,2,


charT db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,2,


charU db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,3,
      db 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,2,


charV db 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,2,


charW db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,3,
      db 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,3,
      db 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1,3,
      db 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1,3,
      db 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0,3,
      db 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,2,


charX db 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0,3,
      db 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,2,


charY db 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,2,


charZ db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,3,
      db 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,3,
      db 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,2,

charEM db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,3,
      db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,2,


charBack db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,3,
      db 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,2,

;存储字母键盘扫描码,按照ascii的顺序
tranToAsc db 0x1E, 0X30, 0x2E, 0x20, 0x12, 0x21, 0x22, 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18, 0x19, 0x10, 0x13, 0x1F, 0x14, 0x16, 0x2F, 0x11, 0x2D, 0x15, 0x2C 

x dw 0;存储字符开始
y dw 0;存储字符开始
c db 0;存储打印的字符
beginx dw 0;字符串开始
beginy dw 0;字符串开始
keyword db 0;存储键盘扫描码


;画横线
%macro row_line 4; 1: x, 2: y, 3: x1, 4 color
	mov cx, %1 ;
	mov dx, %2
	mov al, %4
	mov ah, 0ch ;设置int10 为输入点模式

      %%draw_col:
            int 10h
            inc cx
            cmp cx, %3
            jb %%draw_col

%endmacro

;画竖线
%macro col_line 4 ;1: x, 2: y, 3: y1, 4 color
	mov cx, %1 ;
	mov dx, %2
	mov al, %4
	mov ah, 0ch ;设置int10 为输入点模式
	
      %%draw_row:
            int 10h
            inc dx
            cmp dx, %3
            jb %%draw_row 

%endmacro

;画矩形
%macro rectangle 5 ; 1: x, 2: y, 3: row, 4: col, 5 color
	mov cx, %1 ;
	mov dx, %2
	mov al, %5
	mov ah, 0ch ;设置int10 为输入点模式
	
%%draw_rectanglge0:
	int 10h
	inc cx
	cmp cx, %3 ;比较长度
	jb %%draw_rectanglge0
	inc dx;更新行
	mov cx, %1
	cmp dx, %4
	jb %%draw_rectanglge0
 
%endmacro

%macro selectChar 0
      ;选择字母对应的矩阵
      ;因为空格ascii不连续,这里特判
      ;退格在这里采用的不是真正的 ascii码,而是赋值为92,方便寻找
      mov bl, [c]
      cmp bl, 32
      je %%selectCharEnd

      push ax
     
      mov bx, 0
	mov bl, [c];从[c]获取字符的 ascii
      mov bh, 0
      mov ax, 0
      mov si, charA;指向第一个矩阵开始的地址
      sub bl, 65;算出该字符相对于'A'的偏移量
      mov al, 156;因为一个矩阵的大小为13*12=156,所以一个偏移量相当于矩阵首地址偏移156
      mul bl;算出矩阵的偏移量
      add si, ax;加上矩阵的偏移地址,得到打印的矩阵的地址
      pop ax
      jmp %%selectCharEndEnd
      
      %%selectCharEnd:
            mov si, charEM
      %%selectCharEndEnd:

%endmacro


;打印字符
%macro printChar 1 ; 1color
	mov dx,cs
	mov ds,dx
	selectChar
	
	mov bh, 0

	;设置int10
	mov cx, [x] ;
	mov dx, [y]
	mov al, %1
	mov ah, 0ch

	;循环点
	%%printChar0:
		mov bl, [ds:si]
		cmp bl, 2;2代表矩阵结束
		je %%printChar5

		cmp bl, 3;3代表换行
		je %%printChar3

		cmp bx, 1;1代表应该画的点
		je %%printChar1
		jmp %%printChar2

	%%printChar3:
            ;换行
		inc si
		inc dx
		mov cx, [x]
		jmp %%printChar0
		
	%%printChar1:
		int 10h;画点
		jmp %%printChar2
		
	%%printChar2:
            ;更新打印内容、打印位置
		inc si
		inc cx
		jmp %%printChar0

	%%printChar5:

		
%endmacro

;打印字符串
%macro printStr 4 ;1: beginx, 2:beginy, 3:color 4:str
;往bp寄存器中赋值字符串开始位置, 往beginx,beginy中赋值开始位置
      push bx
      push ax

      ;起始位置赋值
	mov bx, %1
	mov word [beginx], bx
	mov bx, %2
	mov word [beginy], bx


	mov ax, 0
	mov ds,ax
      mov bp, %4;赋值起始地址
      
	
	%%printWelcome0:
            ;判断是否为行末
            mov ah, [ds:bp]
		cmp ah, 0
		je %%printWelcomeEnd
		;jmp %%printWelcome1

            

	%%printWelcome1:
		;初始化字符位置赋值
		mov byte[c], ah
		mov bx, [beginx]
		mov word [x], bx
		mov bx, [beginy]
		mov word [y], bx

		printChar %3
		inc bp
		;更新打印字符的起始位置
		mov bx, [beginx]
		add bx, 12
		mov word [beginx], bx
		

		jmp %%printWelcome0

	%%printWelcomeEnd:

      pop ax
      pop bx
%endmacro


%macro transferChar 0
;用于将扫描码转换为ascii
      ;空格和退格由于ascii不连续,在开头特判
      ;退格在这里采用的不是真正的 ascii码,而是赋值为92,方便寻找
      %%tcharBack:
      ;backspace
            cmp al, 0x0E
            jne %%tcharspace
            mov al,  92
            jmp %%tcharEnd

      %%tcharspace:
      ;space
            cmp al, 0x39
            jne %%tchar0
            mov al, 32
            jmp %%tcharEnd

      %%tchar0:
            mov bx, 0
            mov si, tranToAsc;赋值初始偏移地址
      %%tchar1:
            cmp bl, 25
            ja %%tchar3;如果在数据段内没找到的话,赋值一个默认的值防止出错,该值在打印时会被忽略
            cmp al, [ds:si]
            je %%tchar2;如果相同的话,意味着找到了该扫描码对应字符相对于'A‘的偏移量,否则继续找
            inc bl
            inc si
            jmp %%tchar1
      %%tchar2:
            add bl, 'A';偏移量加上’A‘,获取真正的ascii值
            mov al, bl
            jmp %%tcharEnd            

      %%tchar3:
            mov al, '-'
            jmp %%tcharEnd
      jmp %%tcharEnd
     
      %%tcharEnd:
            

%endmacro


;清屏
clear_screan:
	rectangle 0, 0, 320, 200, 0111b
	ret


start:
	;进入图形模式
	mov al,0x13
	mov ah,0x00
	int 0x10
	mov ax, 0
      mov bl, 0
      mul bl
	
      ;打印首界面
	printStr 100, 20, 0110b, welcomeStr
      printStr 28, 44, 0111b, nextStepStr
      printStr 100, 68, 0010b, aStepStr
      printStr 58, 92, 0010b, bStepStr
      ;printStr 158, 92, 0010b, bStepStr
     

      cli	
	;写入中断向量表 (段地址为 0 , 偏移地址为 0,每个中断向量占四个字节, 程序名(2字节):程序号(2字节))
      mov byte[keyword], 0
	mov word [ds:0x24],int_key	;程序名
	mov word [ds:0x26],0	;程序号
	sti
      ;将存放扫描码的数据置为0,0代表没有读入到内容 
      mov byte[keyword], 0
      chooseFirst0:
      ;循环等待读入用户选择
            mov al, [keyword]
            cmp al, 0
            je chooseFirst0

      chooseFirst1:
             ;进入图片,但是由于图片打印颜色会出现问题,没有实现打印
            cmp al, 0x1E
            jne chooseFirst2
            
            call clear_screan
            ;打印helloworld
            printStr 94, 94, 0110b, helloWorldStr 

      chooseFirst2:
            ;进入打字面板
            cmp al, 0x30
            jne exit_process
            jmp x0
            
      jmp exit_process

x0:
      ;初始化打字面板
      call clear_screan
      mov bx, 0
      mov word[x], bx ;设置打印的初始位置为0,0
      mov word[y], bx

x1:
      ;初始化键盘读入, 0代表没有读入
      mov al, 0
      mov byte[keyword], al;
      
x2:
      ;循环等待键盘输入字符
      mov al, byte[keyword]
      cmp al, 0
      jz x2
      ;读取到键盘输入,开始输出字符
      jmp keyboardShow


keyboardShow:
;显示输入的英文  

      transferChar;将键盘扫描码转为ascii码
      cmp al, '-';代表读到得到是break码,直接忽略
      je x6

      cmp al, 92;代表读到的是退格符号,跳转至退格处理
      je x7

      mov byte[c], al;将要打印的字符放入c中
      
      printChar 0010b ;打印字符
      mov bx, [x] ;更新x位置
      add bx, 12
      cmp bx, 312 ;如果是行末,跳转至下一行
      jne x5

      mov bx, [y]
      add bx, 12
      mov word[y], bx
      mov bx, 0

x5:
      mov word[x], bx
      jmp x1 ;跳转至等待输入
x6:
      jmp x1 ;跳转至等待输入

x7:
      mov bx, [x]
      cmp bx, 0 ;如果此时x是0,代表这时是在行首,跳转至x8处理
      je x8
      sub bx, 12 ;回退x坐标
      mov word[x], bx
      jmp x9
x8:
     ; 回退x
      mov bx, [y]
      cmp bx, 0 ;判断y是否是在第一行
      je x9 
      sub bx, 12 ;回退y到上一行
      mov word[y], bx
      mov bx, 300 ;设置打印位置为行末字符开始位置
      mov word[x], bx
      jmp x9

x9:
      mov byte[c], al
      printChar 0111b ;打印背景色覆盖该位置字符
      jmp x6
      
	
exit_process:
      jmp $
	
int_key:
	push ax
	push dx

	mov dx,0x60;从60端口读出键盘扫描码
	in al,dx

	mov [keyword],al;将扫描码放入byte[keyword]

exit:	mov dx,0x20
	mov al,0x61
	out dx,al

	pop dx
	pop ax
	iret






	

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值