鱼C论坛

 找回密码
 立即注册
查看: 3245|回复: 0

[汇编作业] 实验17

[复制链接]
发表于 2020-6-23 17:37:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 就是要努力呀 于 2020-6-23 17:46 编辑

最后一个实验作业了,用了两个半天时间,可以手动输入逻辑扇区号和读写命令
  1. assume cs:code, ds:data, ss:data_stack, ss:char_stack

  2. data segment
  3.         menu        dw        first, second
  4.         first                db        'please enter the logical sector number:', 0
  5.         second        db        'please enter the action you want to take(0.in, 1.out):', 0
  6.         number        db        0, 0, 0        ;分别存放面,道,扇区
  7.         stack_sp        dw        1024, 1024        ;分别保存data_stack的sp和char_stack的sp
  8. data ends

  9. data_stack segment
  10.         db        1024 dup(0)
  11. data_stack ends

  12. char_stack segment
  13.         db        1024 dup(0)
  14. char_stack ends

  15. code segment
  16. start:        mov ax, data
  17.                 mov ds, ax
  18.                 mov si, 0
  19.                
  20.                 mov ax, data_stack
  21.                 mov ss, ax
  22.                 mov sp, 1024
  23.                
  24.                 mov ax, 0b800h
  25.                 mov es, ax
  26.                
  27.                 ;打印第一句话
  28.                 mov ah, 0
  29.                 ;dh表示行,dl表示列
  30.                 mov dh, 1
  31.                 mov dl, 0
  32.                 call print
  33.                
  34.                 ;获取输入
  35.                 call get_numer
  36.                 ;将字符形式的输入转换成16进制的数字
  37.                 call change_16
  38.                 ;dx中存放着逻辑扇区号
  39.                
  40.                 ;根据逻辑扇区号计算出物理扇区号
  41.                
  42.                 ;计算面号
  43.                 mov ax, dx
  44.                 mov dx, 0
  45.                 mov bx, 1440
  46.                 div bx
  47.                 mov number[0], al

  48.                 ;计算磁道号
  49.                 mov ax, dx
  50.                 mov bl, 18
  51.                 div bl
  52.                 mov number[1], al
  53.                
  54.                 ;计算扇区号
  55.                 add ah, 1
  56.                 mov number[2], ah
  57.                
  58.                 ;打印第二句话
  59.                 mov ah, 1
  60.                 ;dh表示行,dl表示列
  61.                 mov dh, 2
  62.                 mov dl, 0
  63.                 call print
  64.                
  65.                 ;获取输入
  66.                 call get_numer
  67.                 call change_16
  68.                 ;将change_16的返回值放入ah中
  69.                 mov ax, dx
  70.                 mov ah, al
  71.                 mov al, 1
  72.                 add ah, 2
  73.                 ;ah中存放着功能号,al中存放着要读取的扇区数
  74.                
  75.                 ;开始读写
  76.                 mov bx, 0
  77.                 mov es, bx
  78.                 mov bx, 200h
  79.                
  80.                 mov dh, number[0]        ;面号
  81.                 mov dl, 0                        ;驱动器号
  82.                 mov ch, number[1]        ;磁道号
  83.                 mov cl, number[2]        ;扇区号
  84.                
  85.                 int 13h

  86.                 mov ax, 4c00h
  87.                 int 21h

  88. print:        push bx
  89.                 push ax
  90.                 push dx
  91.                 push cx
  92.                 push es
  93.                
  94.                 ;根据ah计算出要打印的句子在内存中的偏移地址
  95.                 mov bl, ah
  96.                 mov bh, 0
  97.                 add bx, bx
  98.                 mov bx, menu[bx]
  99.                
  100.                 ;根据dx计算处打印的行和列
  101.                 mov al, 160
  102.                 mul dh
  103.                 mov di, ax
  104.                 mov al, 2
  105.                 mul dl
  106.                 add di, ax
  107.                
  108.                 mov ch, 0
  109.         print_start:
  110.                         mov cl, ds:[bx]
  111.                         jcxz return0
  112.                         mov es:[di], cl
  113.                         add di, 2
  114.                         inc bx
  115.                         jmp short print_start
  116.                        
  117.         return0: pop es
  118.                         pop cx
  119.                         pop dx
  120.                         pop ax
  121.                         pop bx
  122.                         ret
  123.                        
  124. get_numer:
  125.                 push ax
  126.                 push es
  127.                
  128.                 ;保存数据栈段的sp
  129.                 mov stack_sp[0], sp
  130.                
  131.                 ;使用字符栈段
  132.                 mov ax, char_stack
  133.                 mov ss, ax
  134.                 mov sp, stack_sp[2]
  135.                
  136.         get_numer_start:
  137.                         mov ah, 0
  138.                         int 16h
  139.                         cmp al, 20h        ;如果ascii小于20h,说明不是字符
  140.                         jb not_char

  141.                         ;字符入栈
  142.                         mov ah, 0
  143.                         push ax
  144.                         mov es:[di], al
  145.                         add di, 2
  146.                         jmp get_numer_start

  147.         not_char:
  148.                         cmp ah, 0eh        ;检测是否是退格键的扫描码
  149.                         je        backspace
  150.                         cmp ah, 1ch        ;检测是否是会车键的扫描码
  151.                         je _enter


  152.         backspace:
  153.                         cmp sp, 1024        ;判断栈是否为空栈
  154.                         je get_numer_start
  155.                         sub di, 2
  156.                         mov byte ptr es:[di], ' '
  157.                         pop ax
  158.                         jmp short get_numer_start
  159.                        

  160.         _enter:        ;保存字符栈段的sp
  161.                         mov stack_sp[2], sp
  162.                        
  163.                         ;使用数据栈段
  164.                         mov ax, data_stack
  165.                         mov ss, ax
  166.                         mov sp, stack_sp[0]
  167.                        
  168.                         pop es
  169.                         pop ax
  170.                         ret
  171.                        
  172. change_16:        push ax
  173.                         push bx
  174.                         push cx
  175.                         ;保存数据栈段的sp
  176.                         mov stack_sp[0], sp
  177.                        
  178.                         ;使用字符栈段
  179.                         mov ax, char_stack
  180.                         mov ss, ax
  181.                         mov sp, stack_sp[2]
  182.                        
  183.                         ;将栈的字符型转换成对应的16进制数字
  184.                         mov dx, 0
  185.                         mov bx, 0
  186.                         mov cx, 1
  187.                        
  188.         change_16_start:
  189.                         cmp sp, 1024
  190.                         je return1
  191.                         pop ax
  192.                         sub al, 30h
  193.                         mul cl
  194.                         add dx, ax
  195.                         mov al, 10
  196.                         mul cl
  197.                         mov cx, ax
  198.                         jmp short change_16_start
  199.                         ;运行完后dx中就是输入的数字的16进制
  200.                        
  201.                         ;保存字符栈段的sp
  202.                         mov stack_sp[2], sp
  203.                        
  204.                         ;使用数据栈段
  205.         return1:       
  206.                         mov ax, data_stack
  207.                         mov ss, ax
  208.                         mov sp, stack_sp[0]
  209.                        
  210.                         pop cx
  211.                         pop bx
  212.                         pop ax
  213.                         ret
  214. code ends

  215. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 22:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表