实验8汇编实验.docVIP

  • 0
  • 0
  • 约6.61千字
  • 约 9页
  • 2023-07-23 发布于山西
  • 举报
PAGE / NUMPAGES 实验八 编写子程序(4学时)   在本次实验中,我们将编写3个子程序,通过它们来认识几个常见的问题和掌握解决这些问题的方法。同前面的所有实验一样,这个实验室必须独立完成的,在后面的课程中,将要用到这个实验中编写的3个子程序。 显示字符串   显示字符串是下现实工作中经常要用到的功能,应该编写一个通用的字程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色.   该子程序描述如下: 名称:show_str 功能:在指定位置用指定颜色显示一个用0结束的字符串。 参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址。 返回:无 应用举例:在屏幕的8行3列,用绿色显示data段中的字符串。 assume cs: code data segment  db  ‘Welcome to masm!’, 0 data ends? code segment    start: mov dh, 8      mov dl, 3     mov cl, 2   mov ax, data   mov ds, ax    mov si, 0     call show_str     mov ax, 4c00h   int 21h show_str: :     :      : code ends end start 提示: 子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将它们转化为显存中的地址,首先要分析一下屏幕上的行列位置和显存地址的对应关系; 注意保存子程序中用到的相关寄存器; 这个子程序的内部处理和显存的结构密切相关,但是向外提供了与显存结构无关的接口。通过调用这个子程序,进行字符串的显示时可以不必了解显存的结果,为编程提供了方便.在实验中,注意体会这种设计思想。 data segment   db  ”Welcome to masm! data ends stack segment    db ”Welcome to masm! stack ends? code segment   start:     mov dh, 8     mov dl, 3   mov cl, 2     mov ax, data     mov ds, ax       mov si, 0       mov ax,0B800h     mov es,ax mov ax, stack      mov ss, ax   mov sp,10h   call show_str       mov ax, 4c00h int 21h show_str:     push dx    push cx      mov al,160     dec dh     mul dh     mov bx,ax        add dx,si    add dl,dl   add bl,dl    mov cl,[si]      mov ch,0    jcxz ok   mov es:[bx],cl       pop cx     mov es:[bx+1],cl     inc si pop dx   jmp short show_str ok:         pop cx     pop dx   ret code ends end start 解决除法溢出的问题 前面讲过,div指令可以做除法。当进行8位除法的时候,用al存储商,ah存储余数;进行16位除法时,用ax存储商,dx存储余数。可是,现在有一个问题,如果结果的商大于al或ax所能存储的最大值,那么将如何? 比如,下面的程序段: mov bh, 1 mov ax, 1000 div bh 进行的是8位除法,商为1000,而1000在al中放不下。 又比如,下面的程序段: mov ax, 1000H mov dx, 1 mov bx, 1 div bx 进行的是16位除法,商为11000H,而11000H在ax中放不下。 我们在用div指令做除法的时候,和可能发生上面的情况:结果的商过大,超出了寄存器所能存储的范

文档评论(0)

1亿VIP精品文档

相关文档