鱼C论坛

 找回密码
 立即注册
查看: 2245|回复: 6

求实验13的答案,

[复制链接]
发表于 2012-3-20 11:07:09 | 显示全部楼层 |阅读模式
20鱼币
{:7_166:}求实验13的答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-20 11:07:10 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-20 14:05 编辑
assume cs:code

data segment

        db "welcome to masm!",0

data ends

code segment

start:

        mov ax,cs

        mov ds,ax

        mov si,offset no7c        ;设置si入口地址

        mov ax,0

        mov es,ax

        mov di,200h

        mov cx,offset no7cend-offset no7c 

        cld

        rep movsb                        ;此9句为安装中断例程  将offset no7c 处代码复制进0:200h处

;中断安装以上代码都一样这就是 格式


        mov word ptr es:[7ch*4],200h

        mov word ptr es:[7ch*4+2],0      ;此2句为设置中断向量



        mov dh,10       ;行号

        mov dl,10       ;列号

        mov cl,2        ;颜色属性

        mov ax,data

        mov ds,ax

        mov si,0

        int 7ch         ;调用中断例程



        mov ax,4c00h

        int 21h



no7c:   push ax       ;定义中断例程[开始]

        push bx

        push di

        mov bx,0b800h

        mov es,bx



        mov al,160d   ; 每行160

        mul dh 

        mov di,ax   ;将多少行 传递给di

        mov al,2        ;此6句为确定符合题意的显存的偏移地址, 

        mul dl          ;乘法以后ax为列数   
                           ; 不可用"mov di,160*dh+2*dl"试图达到此6句指令的功能。

        add di,ax    ;将行数与列数相加得出显示位置开始单元



        mov bl,cl

again:  mov cx,[si]    

        jcxz no7cret                    ;判断是否结束  为0 结束并跳转

        mov es:[di],cl                 ; 因为mov cx,[si]      所以cl 存放的是[si]的值也就是每一位字母
     mov es:[di+1],bl                ; 这里bl是颜色

        inc si  

        add di,2

        jmp short again

no7cret:        pop di

                pop bx

                pop ax

                iret    ; 将先前保存的int 7ch中断时push进来的各项出栈恢复cs:ip 继续执行下面代码

no7cend:        nop                ;定义中断例程[结束]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-20 13:20:33 | 显示全部楼层
问题是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-20 13:23:00 | 显示全部楼层
你自己 思考过了么?  写出程序代码 或者一部分代码了么 如果你百思不得其解那就往下看对照答案代码检查一下自己哪里不懂  哪里不明白想不通
如果你完全没有想过没有思考过 那你看完下面的代码对你的启发也不是很大.

三思 !














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

使用道具 举报

发表于 2012-3-20 13:24:11 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-20 13:50 编辑
assume cs:code

code segment

start:

        mov ax,cs

        mov ds,ax

        mov si,offset lp   ;设置si入口

        mov ax,0

        mov es,ax

        mov di,200h

        mov cx,offset lpend-offset lp

        cld

        rep movsb

        ;以上9句为安装中断例程    



        mov word ptr es:[7ch*4],200h

        mov word ptr es:[7ch*4+2],0

        ;以上2句为设置中断向量

; 以上这些完全没有变化 

        mov ax,0b800h

        mov es,ax

        mov di,160*12                ;取得显存第12行第0列的偏移地址

        mov bx,offset s-offset se      ;这里取得  位移量

        mov cx,80

s:      mov byte ptr es:[di],'!'  输入80次!

        add di,2 

        int 7ch   

se:     nop  
  ;以上4句则是对BX进行位移和方向的确定 int 7ch 是调用 进行对loop功能替换的语句

        mov ax,4c00h

        int 21h



lp:     ;中断例程定义[开始]

        push bp  

        mov bp,sp  ;将sp的值给BP  这里bp 代替sp 进行操作  为了结束操作以后sp的值不发生改变继续执行下一段代码

        dec cx   

        jcxz lpret

        add [bp+2],bx 
   ;这里实现loop功能 {返回标号处 } = 向哪个方向 位移多少位 bx值为 -的向上位移  bx值为 +的向下位移
  ;同时进行 CX=0判断如果不为零则继续运行loop功能   为0则跳转到结束loop
lpret:        pop bp              

              iret       ;中断的返回指令  

lpend:        nop        ;中断例程定义[结束]



code ends

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

使用道具 举报

发表于 2012-3-20 13:24:33 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-20 14:03 编辑
assume cs:code

code segment

        s1:        db 'Good,better,best,','$'

        s2:        db 'Never let it rest,','$'

        s3:        db 'Till good is better,','$'

        s4:        db 'And better,best.','$'

        s:         dw offset s1,offset s2,offset s3,offset s4

        row:       db 2,4,6,8



        start:

                mov ax,cs

                mov ds,ax

                mov bx,offset s ;确定各标号所在内存单元

                mov si,offset row ;确定各行数内存单元

                mov cx,4   ;4行

        ok:     mov bh,0

                mov dh,[si]                ;[si]为所填内容

                mov dl,0

                mov ah,2

                int 10h   ;调用 10h号中断将各寄存器的值与显示参数对应起来
; 以上是对行显示设置


                mov dx,[bx]                ;[bx]为所填内容

                mov ah,9

                int 21h

                add bx,2

                inc si                     ;此条指令为所填内容      指向下一个行

                loop ok                    ;此条指令为所填内容     进行循环
;以上对某一行数据进行设置 


                mov ax,4c00h

                int 21h

code ends

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

使用道具 举报

 楼主| 发表于 2012-3-20 20:11:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-19 22:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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