zoukankan      html  css  js  c++  java
  • 王爽 汇编语言 实验十 汇编子程序设计

    子程序1:显示字符串

    assume cs:code

    data segment
    db'100000000',0
    data ends

    code segment
    start:
    mov dh , 2
    mov dl , 5
    mov cl , 2
    mov ax , data
    mov ds , ax
    mov si , 0
    call show_str
    mov ax , 4c00h

    int 21h



    ;名称:show_str
    ;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
    ;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址
    ;返回:无
    show_str:

    push ax
    push bx
    push cx
    push dx
    push si
    push bp
    push di
    push es

    mov al , dh;行号
    add al , 1
    mov bl , 0a0h
    mul bl
    mov dh , 0
    sub dx , 1;
    add dx , dx;因为一个字符占两个字节
    add ax , dx;把dl中的列号加在ax中
    mov di , ax;di放屏幕显示的初始位置

    mov ah , cl;ax 要显示的字符和颜色
    mov ch , 0;cx 确定循环的条件
    mov bx , 0b800h
    mov es , bx;es显示的地址
    mov bp , 0;显示地址的游标
    s_showstr:
    mov cl , ds:[si]
    mov al , ds:[si]
    jcxz retseg
    mov es:[di+bp] , ax
    inc si
    add bp , 2
    loop s_showstr

    retseg:
    pop es
    pop di
    pop bp
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret

    code ends

    end start



     子程序2:解决除法溢出的问题

    assume cs:code
    code segment

    start:

    mov ax , 2h
    mov dx , 2h
    mov cx , 0ah

    call divdw

    mov ax , 4c00h
    int 21h

    ;名称:divdw

    ;功能:进行不会溢出的除法运算,被除数为dword型,除数为word型,结果为dword型

    ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数

    ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数

    ;X/N = int(H/N)*65536 +[rem(H/N)*65536+L]/N

    divdw:

    dataseg_divdw segment

    db 100 dup(0) ;存放参数

    db 100 dup(0) ;存放结果和中间变量

    dataseg_divdw ends



    push bx

    push es



    mov bx , dataseg_divdw

    mov es , bx

    mov es:[0] , ax ;L

    mov es:[2] , dx ;H

    mov es:[4] , cx ;N



    mov dx , 0

    mov ax , es:[2] ;计算 H/N , dx:ax / cx

    div word ptr es:[4]

    mov es:[100] , ax ;结果dx

    mov ax , es:[0];[rem(H/N)*65536+L]/N ren是余数

    div word ptr es:[4]

    mov es:[102] , ax ;结果ax

    mov es:[104] , dx ;结果cx



    mov dx , es:[100]

    mov ax , es:[102]

    mov cx , es:[104]



    pop bx

    pop es



    ret



    code ends

    end start

    子程序3:数值显示(word转字符串)

    assume cs:code 



    data segment

    db 10 dup(0)

    data ends



    code segment

    start:

    mov ax , 10000

    mov bx ,data

    mov ds , bx

    mov si , 0

    call dtoc



    mov dh , 8

    mov dl , 3

    mov cl , 2

    call show_str ; 子程序1实现



    mov ax , 4c00h

    int 21h



    ;名称:dtoc

    ;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符。

    ;参数:(ax)=word型数据,ds:si指向字符串的首地址

    ;返回:无

    dtoc:

    dataseg_dtoc segment

    db 100 dup(0) ;存放参数和寄存器值

    db 100 dup(0) ;存放结果和中间变量

    dataseg_dtoc ends

    push bx

    push es

    push dx

    push cx

    push di



    mov bx , dataseg_dtoc

    mov es , bx

    mov es:[0] , ax

    mov es:[2] , ds

    mov es:[4] , si



    mov bx , 10

    mov di , 0

    mov ax , es:[0]

    s:

    mov dx , 0

    div bx

    mov cx , ax

    add dl , 30h

    mov byte ptr es:[100+di] ,dl

    inc di

    jcxz getCount

    mov cx , 2 ; 当商为1的时候cx-- , 就为1了,就会跳出循环

    loop s



    getCount:

    mov cx , di

    mov ds , es:[2]

    mov si , es:[4]

    reverse:

    mov bl , es:[99+di]

    mov ds:[si] , bl

    inc si

    dec di

    loop reverse

    mov byte ptr ds:[si] , 0



    mov ds , es:[2]

    mov si , es:[4]



    pop di

    pop cx

    pop dx

    pop es

    pop bx

    ret



    code ends

    end start



    子程序3加强版:32位数值转字符串

    assume cs:code 



    data segment

    db 20 dup(0)

    data ends



    code segment

    start:

    mov dx , 0

    mov ax , 10

    mov bx ,data

    mov ds , bx

    mov si , 0

    call dtocex



    mov dh , 8

    mov dl , 3

    mov cl , 4

    call show_str ;子程序1实现



    mov ax , 4c00h
    int 21h



    ;名称:dtocex

    ;功能:将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。

    ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,ds:si指向字符串的首地址

    ;返回:无

    dtocex:

    dataseg_dtocex segment

    db 100 dup(0) ;存放参数和寄存器值
    db 100 dup(0) ;存放结果和中间变量

    dataseg_dtocex ends

    push bx
    push es
    push di
    push cx

    mov bx , dataseg_dtocex
    mov es , bx
    mov es:[0] , ax
    mov es:[2] , ds
    mov es:[4] , si
    mov es:[6] , dx

    mov di , 0
    mov ax , es:[0]

    dtocex_s:
    mov cx , 10
    call divdw;dx:ax / cx = dx:ax~cx;子程序二实现
    add cl , 30h
    mov byte ptr es:[100+di] ,cl
    inc di

    cmp dx , 0
    je dxisz
    jmp dtocex_s

    dxisz:
    cmp ax , 0
    jne dtocex_s


    mov cx , di
    mov ds , es:[2]
    mov si , es:[4]

    dtocex_reverse:
    mov bl , es:[99+di]
    mov ds:[si] , bl
    inc si
    dec di

    loop dtocex_reverse
    mov byte ptr ds:[si] , 0

    mov ds , es:[2]
    mov si , es:[4]

    pop cx
    pop di
    pop es
    pop bx


    ret
    code ends
    end start



  • 相关阅读:
    监控服务器的各种方法
    测试用例之翻页功能
    Python:基础知识
    一篇看懂Docker
    Web测试和app测试区别?
    用经济学的思维来看待安全测试的学习
    Moco测试知多少?
    「网易官方」极客战记(codecombat)攻略-沙漠-先有付出 才有回报-no-pain-no-gain
    「网易官方」极客战记(codecombat)攻略-沙漠-山谷的风与牛-canyon-of-storms
    「网易官方」极客战记(codecombat)攻略-沙漠-复查-double-cheek
  • 原文地址:https://www.cnblogs.com/syxchina/p/2197261.html
Copyright © 2011-2022 走看看