贺利坚老师汇编实验六

任务1-改写菜单程序

读懂并运行菜单程序,然后

(1)用代码的直接定址表改写程序

(2)增加一个功能,菜单显示项为“   5. DEBUG”

(3)在报告中比较原程序与改写后程序的优劣。

报告内容:

assume cs:code, ss:stack

stack segment

     db 100H dup (?)

stack ends

code  segment

      org 100h

start:

      jmp beg

menu  db 10,13,10,13,'           MENU          '

      db 10,13

      db 10,13,'           1. FILE'

      db 10,13,'           2. EDIT'

      db 10,13,'           3. COMPILE'

      db 10,13,'           4. RUN'

      db 10,13,'           0. QUIT'

      db 10,13

      db 10,13,'   please choose one of 0~4:','$'

 

beg:

      push cs

      pop ds     ;设置数据段

disp0:

      lea dx,menu ;DS:DX=待输出字符的地址

      mov ah,9

      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串

 

      mov ah,1

      int 21h     ;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码

 

      cmp al,'0'

      je exit

      cmp al,'1'

      je disp1

      cmp al,'2'

      je disp2

      cmp al,'3'

      je disp3

      cmp al,'4'

      je disp4

      jmp disp0

disp1:

      call sub1

      jmp disp0

disp2:

      call sub2

      jmp disp0

disp3:

      call sub3

      jmp disp0

disp4:

      call sub4

      jmp disp0

 

exit:

      mov ah,4ch

      int 21h

 

sub1  proc near

      jmp sub1_disp

      file db 10,13,'   --new, open, save, print files.---','$',10,13

sub1_disp:

      lea dx,file

      mov ah,9

      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串

      ret

sub1  endp

 

sub2  proc near

      jmp sub2_disp

      edit db 10,13,'   --copy, cut, paste the text.---','$',10,13

sub2_disp:

      lea dx,edit

      mov ah,9

      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串

      ret

sub2  endp

 

sub3  proc near

      jmp sub3_disp

      compile db 10,13,'   --compile the source file, then get target file.---','$',10,13

sub3_disp:

      lea dx,compile

      mov ah,9

      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串

      ret

sub3  endp

 

sub4  proc near

      jmp sub4_disp

      run db 10,13,'   --run, run, run, cannot stop.---','$',10,13

sub4_disp:

      lea dx,run

      mov ah,9

      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串

      ret

sub4  endp

code  ends

      end start

(1)我改写的程序是(我已经加入了足够的注释):

assume cs:code, ss:stack
stack segment
     db 100H dup (?)
stack ends
code  segment
      org 100h
start:
      jmp beg
menu  db 10,13,10,13,'           MENU          '
      db 10,13
      db 10,13,'           1. FILE'
      db 10,13,'           2. EDIT'
      db 10,13,'           3. COMPILE'
      db 10,13,'           4. RUN'
      db 10,13,'           5. DEBUG'
      db 10,13,'           0. QUIT'
      db 10,13
      db 10,13,'   please choose one of 0~4:','$'
      ;13代表回车,10代表换行
      table dw sub1,sub2,sub3,sub4,sub5 ;设置子程序地址表
beg:
      push cs
      pop ds     ;设置数据段
disp0:
      lea dx,menu ;DS:DX=待输出字符的地址
      mov ah,9
      int 21h     
;调用21h中断的第9号功能,显示以'$'结束的字符串

      mov ah,1
      int 21h     
;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码
;注意!!!保存的是ASCII码!!!需要处理为数字
      ;table dw sub1,sub2,sub3,sub4
       sub al,48   ;ASCII码减48得到数字
       cmp al,0    
       je exit     ;0的时候结束程序
       mov bl,al
       mov bh,0
       add bx,bx   ;以字存储所以需要二倍
       sub bx,2    ;因为是从2开始的第一个需要减2
       call word ptr table[bx]  ;寻址指令
       jmp disp0   ;重新输入
exit:
      mov ah,4ch
      int 21h

sub1  proc near
      jmp sub1_disp
      file db 10,13,'   --new, open, save, print files.---','$',10,13
sub1_disp:
      lea dx,file
      mov ah,9
      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串
      ret
sub1  endp

sub2  proc near
      jmp sub2_disp
      edit db 10,13,'   --copy, cut, paste the text.---','$',10,13
sub2_disp:
      lea dx,edit
      mov ah,9
      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串
      ret
sub2  endp

sub3  proc near
      jmp sub3_disp
      compile db 10,13,'   --compile the source file, then get target file.---','$',10,13
sub3_disp:
      lea dx,compile
      mov ah,9
      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串
      ret
sub3  endp

sub4  proc near
      jmp sub4_disp
      run db 10,13,'   --run, run, run, cannot stop.---','$',10,13
sub4_disp:
      lea dx,run
      mov ah,9
      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串
      ret
sub4  endp

sub5  proc near
      jmp sub5_disp
      debug db 10,13,'  --enter, change, track, run assembly language source directly,---','$',10,13
sub5_disp:
      lea dx,debug
      mov ah,9
      int 21h     ;调用21h中断的第9号功能,显示以'$'结束的字符串
      ret
sub5  endp
code  ends
      end start

任务2-输数字,出字母

输入1-9的数字,以其作为序号,输出对应的字母。例如,输入1,输出a;而输入4,输出d

报告内容:

我的程序是(我已经加入了足够的注释):

assume cs:code
code  segment
     alpha db 'abcdefghi'
start:
      mov ah,1
      int 21h    ;External input.

      dec al     ;Because a corresponds to 1, it is reduced by one.
      sub al,48  ;Into numbers.
      mov bl,al
      mov bh,0

      mov ah,02h
      mov dl,0ah
      int 21h    ;Newline output 

      
      mov dl,cs:[bx]
      mov ah,2
      int 21h    ;Output dl.

      mov ah,4ch
      int 21h
code ends
end start

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
matlab版星之咏叹类似雷电的纵版射击游戏-Stellaria Demo App 1.4.0.rar 本帖最后由 stellari 于 2012-9-25 15:24 编辑 本人近来无事,业余写得一款射击游戏。 从画面到游戏风格都是有意识模仿《雷电》的, 但是由于水平和素材的限制,最后成品不是很像,请谅解。 中上配置的电脑应该都能流畅运行,我的联想G460本上在某些敌机过多的场景会略卡。 * 本游戏以“纯”MATLAB写成:不需任何工具包,没有使用任何其他语言* 安装方法: --------- 1. 普通版本 解压附件中的 StellariaTechDemoB20120924.rar 压缩包, 将得到的所有文件放在一个文件夹中(比如该文件夹叫做StellariaTechDemo)即可。 (可以将该文件夹和其子文件夹添加至路径列表中,但这步现在不是必需的了。 2. App版本(仅适用于MATLAB R2012b): 解压附件中的 Stellaria Demo App 1.4.0.rar 在MATLAB主窗口的顶部的选项卡中选择Apps 然后点工具条栏左侧的Install App,在弹出的窗口中选择刚才解压出的文件即可。 运行方法: --------- 普通版本:运行StellariaTechDemo文件夹中的stl_StellariaMain App版本:在Apps面板中的Apps栏内选择Stellaria Demo即可 操作方法: --------- 1P: WSAD - 方向, u - 子弹, i - 炸弹 2P: 方向键 - 方向, insert - 子弹, delete - 炸弹 p - 暂停游戏 1,2 - 1P或2P开始游戏。 更新日志 ----------- 2012\09\25   * 删除了冗余的音乐素材文件 2012\09\24   * 加入App版本(仅R2012b下可用) 2012\09\10   * 现在不需要用户手动添加子目录了,解压后直接运行stl_StellariaMain即可。   * 现在在标题画面和结尾画面时可以直接关闭窗口,不会报错。   * 在游戏中试图关闭窗口,游戏会暂停并提示用户确认退出。若选No(默认)的话游戏会继续进行。 已确认的Bug: --------- 1. MATLAB2010b之前的用户可能会遇到下列错误(已修正): ??? Undefined function or method 'plus' for input arguments of type 'uint64'. Error in ==> stl_StellariaMain at 221                   stageStartTime = stageStartTime pauseElapsedTime.* timer2sec; 解决方案: 将stl_StellariaMain中的221行改为: stageStartTime = uint64 pauseElapsedTime.*timer2sec); 2. 如果遇到下列错误(已修正): ??? Error using ==> eval   Undefined function or variable 'stl_STAGE_TitleScreen'. Error in ==> stl_StellariaMain at 118   bkgMusicPlayer = eval; 请将stl_StellariaMain所在的目录和该目录的所有子目录添加到MATLAB搜索路径中去即可。 --- 用户报告的Bug -- 1. 暂停一段时间后再恢复游戏,在短时间内游戏速度会变得飞快,就像是要赶上刚才暂停时落下的进度一样。    解决方案:未知。 2. 某些文字是倒着的。    解决方案:未知 3. 按1\2键无法开始游戏。    解决方案:请确认中文输入已关闭(感谢会员rihkddd指出);且必须按键盘左上角的1,2键才能进入游戏,按小键盘中的数字键无效。 -- 如有任何问题请跟帖。 谢谢!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值