鱼C论坛

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

求实验13的答案,

[复制链接]
发表于 2012-3-20 11:07:09 | 显示全部楼层 |阅读模式
20鱼币
{:7_166:}求实验13的答案
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-20 11:07:10 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-20 14:05 编辑

  1. assume cs:code

  2. data segment

  3.         db "welcome to masm!",0

  4. data ends

  5. code segment

  6. start:

  7.         mov ax,cs

  8.         mov ds,ax

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

  10.         mov ax,0

  11.         mov es,ax

  12.         mov di,200h

  13.         mov cx,offset no7cend-offset no7c

  14.         cld

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

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


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

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



  19.         mov dh,10       ;行号

  20.         mov dl,10       ;列号

  21.         mov cl,2        ;颜色属性

  22.         mov ax,data

  23.         mov ds,ax

  24.         mov si,0

  25.         int 7ch         ;调用中断例程



  26.         mov ax,4c00h

  27.         int 21h



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

  29.         push bx

  30.         push di

  31.         mov bx,0b800h

  32.         mov es,bx



  33.         mov al,160d   ; 每行160

  34.         mul dh

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

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

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

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



  40.         mov bl,cl

  41. again:  mov cx,[si]   

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

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

  45.         inc si  

  46.         add di,2

  47.         jmp short again

  48. no7cret:        pop di

  49.                 pop bx

  50.                 pop ax

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

  52. no7cend:        nop                ;定义中断例程[结束]

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

使用道具 举报

发表于 2012-3-20 13:20:33 | 显示全部楼层
问题是什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

三思 !














后行!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


  1. assume cs:code

  2. code segment

  3. start:

  4.         mov ax,cs

  5.         mov ds,ax

  6.         mov si,offset lp   ;设置si入口

  7.         mov ax,0

  8.         mov es,ax

  9.         mov di,200h

  10.         mov cx,offset lpend-offset lp

  11.         cld

  12.         rep movsb

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



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

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

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

  17. ; 以上这些完全没有变化

  18.         mov ax,0b800h

  19.         mov es,ax

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

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

  22.         mov cx,80

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

  24.         add di,2

  25.         int 7ch   

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

  28.         mov ax,4c00h

  29.         int 21h



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

  31.         push bp  

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

  33.         dec cx   

  34.         jcxz lpret

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

  39.               iret       ;中断的返回指令  

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



  41. code ends

  42. end start

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

使用道具 举报

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

  1. assume cs:code

  2. code segment

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

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

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

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

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

  8.         row:       db 2,4,6,8



  9.         start:

  10.                 mov ax,cs

  11.                 mov ds,ax

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

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

  14.                 mov cx,4   ;4行

  15.         ok:     mov bh,0

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

  17.                 mov dl,0

  18.                 mov ah,2

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


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

  22.                 mov ah,9

  23.                 int 21h

  24.                 add bx,2

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

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


  28.                 mov ax,4c00h

  29.                 int 21h

  30. code ends

  31. end start

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

使用道具 举报

 楼主| 发表于 2012-3-20 20:11:04 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 20:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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