鱼C论坛

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

[汇编作业] 实验17

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

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

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

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

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

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

data_stack segment
        db        1024 dup(0)
data_stack ends

char_stack segment
        db        1024 dup(0)
char_stack ends

code segment
start:        mov ax, data
                mov ds, ax
                mov si, 0
                
                mov ax, data_stack
                mov ss, ax
                mov sp, 1024
                
                mov ax, 0b800h
                mov es, ax
                
                ;打印第一句话
                mov ah, 0
                ;dh表示行,dl表示列
                mov dh, 1
                mov dl, 0
                call print
                
                ;获取输入
                call get_numer
                ;将字符形式的输入转换成16进制的数字
                call change_16
                ;dx中存放着逻辑扇区号
                
                ;根据逻辑扇区号计算出物理扇区号
                
                ;计算面号
                mov ax, dx
                mov dx, 0
                mov bx, 1440
                div bx
                mov number[0], al

                ;计算磁道号
                mov ax, dx
                mov bl, 18
                div bl
                mov number[1], al
                
                ;计算扇区号
                add ah, 1
                mov number[2], ah
                
                ;打印第二句话
                mov ah, 1
                ;dh表示行,dl表示列
                mov dh, 2
                mov dl, 0
                call print
                
                ;获取输入
                call get_numer
                call change_16
                ;将change_16的返回值放入ah中
                mov ax, dx
                mov ah, al
                mov al, 1
                add ah, 2
                ;ah中存放着功能号,al中存放着要读取的扇区数
                
                ;开始读写
                mov bx, 0
                mov es, bx
                mov bx, 200h
                
                mov dh, number[0]        ;面号
                mov dl, 0                        ;驱动器号
                mov ch, number[1]        ;磁道号
                mov cl, number[2]        ;扇区号
                
                int 13h

                mov ax, 4c00h
                int 21h

print:        push bx
                push ax
                push dx
                push cx
                push es
                
                ;根据ah计算出要打印的句子在内存中的偏移地址
                mov bl, ah
                mov bh, 0
                add bx, bx
                mov bx, menu[bx]
                
                ;根据dx计算处打印的行和列
                mov al, 160
                mul dh
                mov di, ax
                mov al, 2
                mul dl
                add di, ax
                
                mov ch, 0
        print_start:
                        mov cl, ds:[bx]
                        jcxz return0
                        mov es:[di], cl
                        add di, 2
                        inc bx
                        jmp short print_start
                        
        return0: pop es
                        pop cx
                        pop dx
                        pop ax
                        pop bx
                        ret
                        
get_numer:
                push ax
                push es
                
                ;保存数据栈段的sp
                mov stack_sp[0], sp
                
                ;使用字符栈段
                mov ax, char_stack
                mov ss, ax
                mov sp, stack_sp[2]
                
        get_numer_start:
                        mov ah, 0
                        int 16h
                        cmp al, 20h        ;如果ascii小于20h,说明不是字符
                        jb not_char

                        ;字符入栈
                        mov ah, 0
                        push ax
                        mov es:[di], al
                        add di, 2
                        jmp get_numer_start

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


        backspace:
                        cmp sp, 1024        ;判断栈是否为空栈
                        je get_numer_start
                        sub di, 2
                        mov byte ptr es:[di], ' '
                        pop ax
                        jmp short get_numer_start
                        

        _enter:        ;保存字符栈段的sp
                        mov stack_sp[2], sp
                        
                        ;使用数据栈段
                        mov ax, data_stack
                        mov ss, ax
                        mov sp, stack_sp[0]
                        
                        pop es
                        pop ax
                        ret
                        
change_16:        push ax
                        push bx
                        push cx
                        ;保存数据栈段的sp
                        mov stack_sp[0], sp
                        
                        ;使用字符栈段
                        mov ax, char_stack
                        mov ss, ax
                        mov sp, stack_sp[2]
                        
                        ;将栈的字符型转换成对应的16进制数字
                        mov dx, 0
                        mov bx, 0
                        mov cx, 1
                        
        change_16_start:
                        cmp sp, 1024
                        je return1
                        pop ax
                        sub al, 30h
                        mul cl
                        add dx, ax
                        mov al, 10
                        mul cl
                        mov cx, ax
                        jmp short change_16_start
                        ;运行完后dx中就是输入的数字的16进制
                        
                        ;保存字符栈段的sp
                        mov stack_sp[2], sp
                        
                        ;使用数据栈段
        return1:        
                        mov ax, data_stack
                        mov ss, ax
                        mov sp, stack_sp[0]
                        
                        pop cx
                        pop bx
                        pop ax
                        ret
code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-30 18:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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