等雨 发表于 2012-3-20 11:07:09

求实验13的答案,

{:7_166:}求实验13的答案

莫名其妙 发表于 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:,200h

      mov word ptr es:,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,   

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

      mov es:,cl               ; 因为mov cx,      所以cl 存放的是的值也就是每一位字母
   mov es:,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                ;定义中断例程[结束]

swjqwe 发表于 2012-3-20 13:20:33

问题是什么?

莫名其妙 发表于 2012-3-20 13:23:00

你自己 思考过了么?写出程序代码 或者一部分代码了么 如果你百思不得其解那就往下看对照答案代码检查一下自己哪里不懂哪里不明白想不通
如果你完全没有想过没有思考过 那你看完下面的代码对你的启发也不是很大.

三思 !














后行!

莫名其妙 发表于 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:,200h

      mov word ptr es:,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:,'!'输入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 ,bx
   ;这里实现loop功能 {返回标号处 } = 向哪个方向 位移多少位 bx值为 -的向上位移bx值为 +的向下位移
;同时进行 CX=0判断如果不为零则继续运行loop功能   为0则跳转到结束loop
lpret:      pop bp            

            iret       ;中断的返回指令

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



code ends

end start

莫名其妙 发表于 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,                ;为所填内容

                mov dl,0

                mov ah,2

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


                mov dx,                ;为所填内容

                mov ah,9

                int 21h

                add bx,2

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

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


                mov ax,4c00h

                int 21h

code ends

end start

等雨 发表于 2012-3-20 20:11:04

莫名其妙 发表于 2012-3-20 13:24 static/image/common/back.gif


谢谢啊,学习了
页: [1]
查看完整版本: 求实验13的答案,