汇编语言实验十

编写子程序

一、 实验目的

巩固前面所学知识,编写三个子程序:显示字符串,解决除法溢出的问题,数值显示。

二、 实验内容或主要代码

  1. 子程序名称: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
  2. 名称:divdw
    功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
    参数:(ax) = dword型数据的低16位,(dx) = dword型数据的高16位,(cx)= 除数
    返回:(dx) = 结果的高16位,(ax)= 结果的低16位,(cx) = 余数
    应用举例:计算1000000/10(F4240H/0AH)
    mov ax, 4240H
    mov dx, 000FH
    mov cx, 0AH
    call divdw
    结果:(dx) =0001H,(ax) = 86A0H,(cx) = 0
  3. 编程,将data段中的数据以十进制的形式显示出来。
    data segmemt
    dw 123, 12666,1, 8, 3, 38
    data ends
    子程序描述
    名称:dtoc
    功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符。
    参数:(ax) = word型数据,ds:si指向字符串的首地址。
    返回:无
    应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。在显示时调用本次实验中的第一个子程序show_str。
    assume cs:code
    data segment
    db 10 dup (0)
    data ends
    code segment
    start: mov ax,12666
    mov bx,data
    mov ds,bx
    mov si,0
    calldtoc
    mov dh,8
    mov dl,3
    mov cl,2
    call show_str
    ……
    code ends
    end start

三、 实验结果或截图

  1. 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:mov ax,0b800h
    mov es,ax
    mov al,cl
    mov bp,0
    mov ch,0
    mov cl,dh
    s0:add bp,160
    loop s0
    mov di,0
    mov ch,0
    mov cl, dl
    s1:add di,2
    loop s1
    s2:mov cl,ds:[si]
    jcxz s3
    mov es:[bp+di],cl
    inc di
    mov es:[bp+di],al
    inc di
    inc si
    loop s2
    s3:ret
    code ends
    end start

在这里插入图片描述
2. assume cs:code
code segment
start:mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h

divdw:mov bx,ax
mov ax,dx
mov dx,0
div cx
mov si,ax
mov ax,bx
div cx
mov cx,dx
mov dx,si
ret

code ends
end start

在这里插入图片描述
经过数次追踪后:

在这里插入图片描述
3. assume cs:code
data segment
db 10 dup(0)
data ends
code segment
start:mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:mov dx,0
mov bx,10
s:div bx
mov cx,ax
jcxz s0
add dx,30h
mov ds:[si],dl
inc si
mov dx,0
mov cl,2
loop s
s0:mov ds:[si],dl
mov si,0
ret
show_str:mov ax,0b800h
mov es,ax
mov al,cl
mov bp,0
mov ch,0
mov cl ,dh
s1:add bp,160
loop s1
mov di,0
mov ch,0
mov cl,dl
s2:add di,2
loop s2
s3:mov cl,ds:[si]
jcxz s4
mov es:[bp+di],cl
inc di
mov es:[bp+di],al
inc di
inc si
loop s3
s4:ret
code ends
end start

在这里插入图片描述
四、 实验分析或体会

此次实验结合了许多所学知识点,通过此次实验,我巩固了所学知识,如编写通用子程序来实现显示字符串、数据功能,并且可灵活的决定显示的位置(行、列)、内容和颜色。当CPU执行div错误时可能会发生除法溢出的问题,可通过设计子程序来解决。将二进制信息转化为十进制形式的字符串也是常用的功能,也可将其编写为通用子程序。掌握这些方法,可以运用到后续学习中。

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值