十六进制,汇编语言

By admin in 美高梅手机版4858 on 2019年9月17日

一、实验指标

汇编将输入的十进制数字转变到二进制,八进制,十六进制,代码写出来了,可是却力不胜任不奇怪运作 1C
data segment
mesg db ‘please input :’,0ah,0dh,’$’
buf db 5
db ?
db 5 dup
buf1 db 5 dup
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,mesg ;在显示器上体现mesg标号后的源委
mov ah,9
int 21h

求大神:这段汇编代码写入mbr之后,能装入并进行,然则来得不断小编要的字符串
;;小编想写二个mbr的教导代码,一部分写好后发觉运维不平常,就改成下边这段测量检验代;;;码,见鬼的是:不论你是用0000:7c00h用作cs:ip来安装偏移量,如故改成未来那;;;;;样子用07c0::0000当作入口指针都没办法儿正确读取程序内的字符串,不晓得是偏移量设;;置难题,还是其余难题,即便去掉字符串,改用mov
al,’a’,inc al的诀要来循环输出;;;;;单个字符就能够健康突显。
;;??莫非mbr装入内部存款和储蓄器时也安装了PSP,可是psp是由dos装入的呀。

# 常见汇编代码 #

1、了解操作系统的连串机能调用。

mov bx,10lea dx,buf ;从键盘输入一个字符到缓冲区mov ah,0ahint 21hmov si,offset buf+2 mov di,offset buf1mov cl,buf+1 ;将实际输入字符个数送入cl中

;;那是安装程序,肩负将bootstrap标号之后的代码先装入buff指向的512
byte内部存款和储蓄器,之后再将这段内部存款和储蓄器数据写入磁盘的mbr扇区

  1. 编写程序:相比AX,BX,CX中带符号数的分寸,将最大的数放在AX中

2、领悟用C语言完结系统功效调用的不二等秘书诀和步骤。

aga:
mov al,[si] ;将输入的首先个字符对应的ASCII码送入al中
sub al,30h ;得到输入的首先个数的原值
mov ah,0
xchg ax,[di]

;;—————安装程序————————————————————
assume cs:code,ds:data,ss:stack
data segment
msg1 db ‘written to disk successfully$’
buff db 510 dup
db 55h,0aah
msg2 db ‘failed to write to disk$’

        code segment

3、驾驭使用10H号功用调用(BIOS的展现I/O成效调用)来贯彻对显示屏的操作与调整。

mul bx

data ends
stack segment
db 32 dup

        assume cs:code

二、实验内容

xchg [di],ax
add [di],ax
inc si
loop aga
mov bx,[di]
mov dl,0ah
mov ax,2
int 21h
mov dl,0dh
int 21h
mov cx,16
last:
mov dl,’0′
rol bx,1
jnc next ;与cf标识有关,若不进位,即cf=0,则跳转
mov dl,’1′
next:
mov ah,2 ;展现dl中的字符
int 21h
loop last
mov ah,2
mov dl,0ah
int 21h
mov dl,0dh
int 21h ;换行
mov cx,4
aga2:
push cx
mov cl,4
rol bx,cl ;将bh的高4位循环左移入al的低4位中
pop cx
mov dx,bx
and dl,0fh ;将dl的高4位清零,保留dl的低4位,即bh中的高4位
cmp dl,10
jc then ;进位则跳转,即dl小于10
add dl,7
then:
add dl,30h
mov ah,2
int 21h
loop aga2
mov dl,0ah
int 21h
mov dl,0dh
int 21h ;换行

stack ends
code segment
main:
mov ax,data
mov ds,ax
mov es,ax
mov ax,stack
mov ss,ax
mov sp,32

        mov ax,32

1、在荧屏的钦赐区域内展现字符串。(必做题)

;========================转换为8进制==============================
mov dl,’1′ ;假设bx=1100 0000 0000 0000
rol bx,1 ;逻辑循环左移则发出进位
jc then1 ;发生进位后则跳转到then1,展现8进制第壹个人为1
mov dl,’0′ ;未发生进位,则率先位展现0
then1:
mov ah,2
int 21h
mov cx,5 ;/3=5,3个二进制数表示三个八进制数
aga3:
push cx
mov cl,3
rol bx,cl ;循环左移3位
pop cx
mov dx,bx
and dl,07h ;07h=0000 0111b,将dl的高4位清零,低4位的首先位清零
add dl,30h
mov ah,2
int 21h
loop aga3

;;将欲装入mbr的代码先装入buff定义的内部存储器缓冲区,之后再利用int
13h写入磁盘
lea di,buff
lea si,bootstrap
push ds
push cs
pop ds
mov cx,bootstrap_end-bootstrap
cld
rep movsb
pop ds
;;int 13h 将缓冲区的512字节写入磁盘mbr

        mov bx,74

2、在显示器的制订区域内画框,在框内展现字符串。(进步题)

mov ah,4chint 21h

lea bx,buff
mov ax,0301h
mov ch,0
mov cl,1
mov dh,0
mov dl,82h;;我的U盘
int 13h

        mov cx,23

3、在荧屏上点名区域内画框并以动画格局突显字符串。(选做题)

code ends
end start

;;判别写入磁盘是不是成功
cmp ah,0
je success;;成功就跳转
;;不成功就打字与印刷字符串到荧屏
mov cx,29
mov dh,12
mov dl,25
mov ah,13h ;the 13rd sub process of int 10 prints the string to the
screen
mov al,0
mov bl,4
mov bh,0
lea bp,msg2
int 10h
jmp end1

        sort: cmp ax,bx

清屏子程序:

不精晓不当在哪儿…
还请大神指教

;;成功也打字与印刷成功的提醒音讯到荧屏
success:
mov cx,29
mov dh,12
mov dl,25
mov ah,13h
mov al,0
mov bl,4
mov bh,0
lea bp,msg1
int 10h

              jge X          ;倘若ax大于等于bx就跟cx相比

void cls(void)

end1:
mov ax, 4c00h ;;主程序甘休
int 21h
——————————待安装代码———————————————

              xchg ax,bx

{ union REGS r;

;;以下是将要写入mbr代码部分,到bootstrap_end 结束
bootstrap:
mov ax,0
mov ss,ax
mov sp,7c00h
mov ax,07c0h
mov ds,ax
;;利用retf 改动cs,ip饼跳转到go0标号处施行
十六进制,汇编语言。push ax
mov ax,go0-bootstrap
push ax
retf
;;完毕在显示器上输出reset标号处的字符串
go0:
mov ax,0b800h
mov es,ax
mov di,800
mov bx,reset-bootstrap
sss1:
mov al,[bx]
cmp al,0
je sss2
mov es:[di],al
add bx,1
add di,2
jmp sss1

            X:cmp ax,cx      ;如果ax大于cx

  r.h.ah=6; /*子作用号*/

sss2:;;死循环
mov ah,0
int 16h
jmp sss2
reset: db ‘reset pc$$$$$$$’,0
bootstrap_end:
code ends
end main

              jge Y

  r.h.al=0;   

              xchg ax,cx

r.h.ch=0; /*左上角坐标*/

            Y:int 21h

  r.h.cl=0;

              mov ax,4c00h

  r.h.dh=24; /*右下角坐标*/

        code ends

  r.h.dl=79;

            end sort

  r.h.bh=7; /*7象征酸性绿*/

2.供给对键盘输入的小写字母用大写字母显示出来

  int86(0x10,&r,&r); /*系统机能调用*/

        code segment

 }

        assume cs:code

定位子程序:

        start: mov ah,1

void locate(int x, int y)

            int 21h

{ union REGS r;

            cmp al,’a’     

  r.h.ah=2; /*子效率号*/

            jz error

  r.h.dh=x; /*定位点坐标*/

            cmp al,’z’

r.h.dl=y;

            ja error

r.h.bh=0;

            sub al,20h      ;’A’~’Z’:41~5AH    ‘a’~’z’:61~7ah

int86(0x10,&r,&r);

            mov dl,al

}

            mov ah,2

在钦定地点写参数:

            int 21h

void writech(int x , int y, char ch ,int attr)

            jmp start

{ union REGS r;

        error:ret

  locate(x ,y);

    code ends

  r.h.ah=9;

        end start

  r.h.bh=0;

3.编写程序:从键盘上收到二个肆人数的十进制数,并在极限上出示出与它等值的二进制数。

  r.h.al=ch;

        code segment

r.h.bl=attr

          assume cs:code

r.x.cx=1;

        begin:xor bx,bx      ;清空bx

int86(0x10,&r,&r);

              mov ch,4

}

              mov cl,4        ;设置内外层的巡回次数

荧屏画框能够用制表符来画。其根本情势是无休止调用writech函数,在钦命区域相近展现制表符,进而勾勒出叁个窗口的概貌。

        input:shl bx,cl        ;bx中的内容逻辑左移

制表符   ASCII码

              mov ah,1

┛ 217

              int 21h          ;输入

┏ 218

              cmp al,30h        ;是还是不是小于0

┓ 191

              jb  input        ;是就重新输入

┗ 192

              cmp al,39h        ;是或不是赶上9

┃ 179

              ja  input   

━ 196

              and al,0fh        ;调换为相应的二进制

              jmp combine

        combine:or bl,al       

                dec ch

                jnz input

        display:mov cx,16        ;输出的巡回次数

          print:mov dl,0

                rol bx,1

                rcl dl,1

                or dl,30h        ;清空dl

                mov ah,2

                int 21h

                loop print

                ret

        code ends

            end begin

4.将内存ffff:0~ffff:d单元中的数据复制到0:200~0:20d单元中。

    code segment

    assume cs:code

            mov bx,0

            mov cx,0fh

    copy:mov ax,0ffffh 

          mov ds,ax

          mov dl,[bx]

          mov ax,0020h

          mov ds,ax

          mov [bx],dl

          inc bx

          loop copy

        mov ax,4c00h

        int 21h

    code  ends

            end copy

5.将AX寄存器中的十五人数分成四组,每组三位,然后把这四组数分别放在AL、BL、CL和DL中。

    data segment

      s db 4 dup(?)  ;占位,并清空

    mov ax,0ffffh

    data ends

    ;———————————– 

    progrnam segment

              assume cs:progrnam,ds:data

    begin:mov cl,4    ;ax逻辑右移五回

          mov ch,4   

          lea bx,s

      X: mov dx,ax

        and dx,0fh      ;逻辑与屏蔽高位

        mov [bx],dl  ;以字节方式将dl移入bx

        inc bx

        shr ax,cl      ;逻辑右移

        dec ch

        jnz X

      Y: mov dl,s        ;依次移入相应贮存器内

        mov cl,s+1

        mov bl,s+2

        mov al,s+3

        ret   

    progrnam ends

        end begin

6.从键盘输入一多样字符,以字符‘$’为终结符,然后对个中的非数字字符计数,并出示出计数结果。

    `stack segment

        dw  100h    dup(?)

        top  label  word

    stack ends

    data segment

            h1  db  ‘Please input a string: ‘,’$’

            h2  db ‘The number of the chars that is not digit:’,’$’

          crlf  db 0dh,0ah,24h

    data  ends

    code  segment

          assume  cs:code,ds:data,ss:stack

    main  proc    far

      begin:mov    ax,stack

            mov    ss,ax

            lea    sp,top

            mov    ax,data

            mov    ds,ax

            lea    dx,h1

        mov    ah,9

        int    21h

            mov    cx,0

    input:    mov    ah,1

            int    21h

            cmp    al,’$’

            jz      exit

            cmp    al,30h

            jb      count

            cmp    al,39h

            jnb    count

            jmp    input

    count:  inc    cx

            jmp    input

    exit:  lea    dx,crlf

            mov    ah,9

            int    21h

            lea    dx,h2

            int    21h

            mov    si,0

            mov    bl,10

            mov    ax,cx

    mem:    div    bl

            mov    dl,ah

            mov    dh,0

            push    dx

            inc    si

            mov    ah,0

            cmp    al,0

            jnz    mem

    prin:    pop    dx

            add    dl,30h

            mov    ah,2

            int    21h

            dec    si

            cmp    si,0

            jnz    prin

            mov    ah,4ch

            int    21H

    main    endp

    code    ends

            end  begin

    `

7.已知三个整数变量A和B,试编写实现下述操作的次序:

(1)若五个数中有多少个数是奇数,则将奇数存入A中,偶数存入B中

(2)若八个数均为奇数,则两数分别加1,并存回原变量。

(3)若几个数均为偶数,则两变量不改变。

    code segment

        assume cs:code

    begin: mov ax,13

          mov bx,12

          mov cx,ax

          mov dx,bx

          xor ax,bx

          test ax,0001h    ;A和B是不是还要为奇数或偶数

          jz next          ;是

          test bx,0001h 

          jz return        ;B为偶数,A为奇数,加1

    exchange:mov ax,dx        ;A为偶数,B为奇数,交换

          mov bx,cx

          jmp return

      next:test bx,0001h    ;是或不是同为奇数

          jz return        ;同为偶数,不改变

          inc dx

          inc cx

          jmp exchange

      return:ret

    code ends

          end begin

8.比非常多个字符串string1和string2所含的字符是或不是一样。若同样则显得‘true’,不然展现‘false’。

    data segment

        string1 db ‘i am a student’

        string2 db ‘i am a student’

        string3 db ‘true’,0dh,0ah,’$’

        string4 db ‘false’,0dh,0ah,’$’

    data ends

    ;————————–   

    progrnam  segment

          assume cs:progrnam,ds:data

    start:push ds

          sub ax,ax

          push ax

          mov ax,data

          mov ds,ax

          mov es,ax

    begin:lea si,string1

          lea di,string2

          cld 

          mov cx,string2-string1

          repe cmpsb

          jne Y

          lea dx,string3

          jmp print     

        Y:lea dx,string4

        print: mov ah,9

          int 21h

        mov ax,4c00h

        int 21h

    progrnam ends

        end start

9.编写无溢出除法的汇编子程序 。

此处所说的除法溢出并非指分母为0而产生溢出的动静。我们以除数为8位的气象来证实,借使大家的被除数为65535(十三个人的最大值)存款和储蓄在AX
中,除数为1,存款和储蓄在CL中,然后实践除法指令: div
CL。按照上面包车型大巴说法,结果都以放在AX中的,余数为0,当然那没卓殊,然则商为65535要放在AL中却是放不下的,因为AL能贮存的最大值只为
255,所以那时候就能发出溢出。大家能够看来65535/1 =
255,那显明与笔者位平常的除法结果不符。

哪些缓和那几个溢出标题

既然大家掌握了难题的来源于,要消除它就不困难了。为了统一并且不发出溢出,我们能够把装有的除法的商都用三十个人来保存,即具有的被除数都用30位,全部的除数都用14位,全体的商都用
三15个人,全体的余数都用15个人来保存,就足以消除这几个标题,因为叁个数除以三个子弹头后,不只怕超乎其以前的值。而对于8位的除法,除数和被除数的上位全用
0补全就能够。为了达成那几个指标,大家就无法使用暗许的除法指令div了,而急需大家写代码来得以实现大家自定义的除法。

自定义除法: X为除数,N为被除数,H代表X的高13位,L代表X的低14人,

int(H/N)和rem(H/N)代表着H除以N的商和余数

X/N = int(H/N)* 2^16 + [rem(H/N)* 2^16+L]/N

    progrnam segment

              assume cs:progrnam

              mov ax,0ffffh

              mov cx,1          ;初叶化进行测量检验

    begin: cmp cx,0

            je return  ;除数不可能为0

            push bx

            push ax

            mov ax,dx

            mov dx,0

            div cx  ;实行H/N,商保存在ax中,余数在DX中

            mov bx,ax ;把商保存

            pop ax    ;抽取低位,实行rem(H/N)*2^16+L

            div cx    ;执行[rem(H/N)*2^16+L]/N ,商保存在ax中
,余数在dx中

            mov cx,dx ;cx保存余数

            mov dx,bx ;dx中保留高位除法的商

            pop bx

    return:ret

        mov ax,4c00h

        int 21h

    progrnam ends

          end begin

10.编辑一个顺序,接受从键盘输入的12个十进制数字,输入回车符则结束输入,然后将那个数字加密后(用XLAT指令转变)存入内部存储器缓冲区BUFFEKuga。加密表为:

  输入数字:0,1,2,3,4,5,6,7,8,9

  密码数字:7,5,9,1,3,6,8,0,2,4

    data segment

        number db 7,5,9,1,3,6,8,0,2,4

        buffer db 10 dup(?)

    data ends

    ;————————————-

    code segment

        assume cs:code,ds:data

        mov si,0

        mov cx,10

        lea bx,number

    input:mov ah,1

          int 21h

          cmp al,0dh    ;是还是不是为回车符

          jz return

          cmp al,30h    ;比较是还是不是是0~9,不是就再度输入

          jb input

          cmp al,39h

          ja input

          xlat          ;转变进行仓库储存

          mov buffer[si],al

          inc si

          loop input

    return:ret

    code ends

    end input

    data segment

        number db 7,5,9,1,3,6,8,0,2,4

        buffer db 10 dup(?)

    data ends

    ;————————————-

    code segment

        assume cs:code,ds:data

        mov si,0

        mov cx,10

        lea bx,number

    input:mov ah,1

          int 21h

          cmp al,0dh    ;是还是不是为回车符

          jz return

          cmp al,30h    ;相比是不是是0~9,不是就重新输入

          jb input

          cmp al,39h

          ja input

          xlat          ;转变举行仓储

          mov buffer[si],al

          inc si

          loop input

    return:ret

    code ends

        end input

11.编辑二个子主次嵌套结构的前后相继模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式呈现出来。

    主程序TELIST:

    A.    显示提示符“INPUT  NAME:”;

    B.    调用子程序INPUT_NAME输入姓名;

    C.    彰显提醒符“INPUT  A  TELEPHONE  NUMBE福睿斯:”;

    D.    调用子程序INPHONE输入电话号码;

    E.    调用子程序PWranglerINTLINE展现姓名及电话号码。

    子程序INPUT_NAME:

    A.    调用键盘输入子程序GETCHA中华V,把输入的真名寄存在INBUF缓冲区中;

    B.    把INBUF中的姓名移入输出游OUTNAME。

    子程序INPHONE:

    A.   
调用键盘输入子程序GETCHA凯雷德,把输入的8位电话号码贮存在INBUF缓冲区中;

    B.    把INBUF中的号码移入输出游OUTPHONE。

    子程序PRINTLINE:

    突显姓名及电话号码,格式为:

      NAME    TEL.

      X X X        XXXXXXXX

代码如下:

    data segment

        tipname db ‘input name:’,’$’

        tipnumber db ‘input a telephone number:’,’$’

        inbuf db 12 dup(‘ ‘)

        crlf db 0dh,0ah,’$’

        outname db 16 dup(‘ ‘)

        outphone db 12 dup(‘ ‘),0dh,0ah,’$’

        info db ‘name’,12 dup(‘ ‘),’tel’,0dh,0ah,’$’

    data ends

    ;————————————

    stack segment

          dw 100 dup(?)      ;伪定义使得同叁个变量具备分化的习性

        string label word 

    stack ends

    ;—————————————-

    progrnam segment

    main proc far

          assume cs:progrnam,ds:data,es:data,ss:stack

      start:mov ax,stack

            mov ss,ax

            mov sp,offset string

            push ds

            xor ax,ax

            push ax

            mov ax,data

            mov ds,ax

            mov es,ax

      begin:             

            mov ah,09          ;输出提醒字符串

            mov dx,seg tipname

            mov ds,dx

            mov dx,offset tipname

            int 21h

            call input_name    ;输入姓名

            mov ah,09          ;输出提示字符串

            mov dx,seg tipnumber

            mov ds,dx

            mov dx,offset tipnumber

            int 21h

            call input_number

            call printline   

            ret

    main endp

    ;——————————————

    input_name proc near

                call getchar

                lea si,inbuf

                lea di,outname

                mov cx,12      ;设置计数器

                cld            ;设置方向为自增

    ;movsb 与rep结合是传递字节,也正是 movs es:byte ptr[di],ds:[si]

                rep movsb     

                ret

    input_name endp

    ;———————————————–

    input_number proc near

            call getchar

            lea si,inbuf

            lea di,outphone

            mov cx,12

            cld

            rep movsb

            ret

    input_number endp

    ;————————————————

    getchar proc near

            mov al,20h

            mov cx,12

            lea di,inbuf

            cld

    ;stosb这里是为着每贰次输入贰个字节存入相应的缓冲区

            rep stosb

            mov cx,12

            mov di,0

      input:mov ah,1

            int 21h

            cmp al,0dh

            jz return

            mov inbuf[di],al

            inc di

            loop input

        return: call disp_crlf          ;输出回车符

                ret

    getchar endp

    ;————————————–

    printline proc near            ;这里均是将所得的字符串举办输出

              mov ah,09

              mov dx,seg info

              mov ds,dx

              mov dx,offset info

              int 21h

              mov ah,09

              mov dx,seg outname

              mov ds,dx

              mov dx,offset outname

              int 21h

              ret

    printline endp

    ;—————————————

    disp_crlf proc near

              mov ah,09

              mov dx,seg crlf

              mov ds,dx

              mov dx,offset crlf

              int 21h

              ret

    disp_crlf endp

    ;—————————————–

    progrnam ends

            end start

12.试编辑二个汇编语言子程序,须求将富含自由字符、以0结尾的字符串中的小写字母调换到大写字母。

    data segment

          string db ‘i am A stuDEnt’,0h

    data ends

    ;——————————

    progrnam segment

        assume ds:data,cs:progrnam

    start:push ds

        xor ax,ax   

        mov ax,data

        mov ds,ax

        lea si,string

        push si   

    begin: mov al,[si]      ;推断是还是不是为小写字母并展开转移

          cmp al,0

          je return   

          cmp  al,’a’

          jb print

          cmp  al,’z’

          ja print          ;假使不是小写字母直接开展输出

          sub al,20h

          mov [si],al

    print:push ds          ;将字母实行输出

          ;mov al,[si]

          mov dl,al

          mov ah,2

          int 21h

          pop ds     

        n:inc si

          jmp begin   

    return:

          pop si

          pop ds

        mov ax,4c00h

        int 21h

    progrnam ends

        end start

13.编写程序,将一个包涵有18个数据的数组M分成多个数组:正数数组P和负数数组N,并各自把那五个数组中数据的个数字显示示出来。 

    data segment

        string1 db 0dh,0ah, ‘positive number:’,’$’

        string2 db 0dh,0ah,’negative number:’,’$’

        array dw  1,2,3,4,5,6,7,8,-4,-8,-9,-6,-2,-8,8,12,18,-12,5,64

        array1 dw 20 dup(?)    ;存款和储蓄正数数组

        array2 dw 20 dup(?)      ;存款和储蓄负数数组

        count1 db 0

        count2 db 0              ;计数

        CRLF DB 0dh,0ah,’$’

    data ends

    ;———————————-

    progrnam segment

    main proc far

        assume ds:data,cs:progrnam

        s:  push ds

            xor ax,ax

            push ax

            mov ax,data

            mov ds,ax 

        begin:mov cx,20        ;循环次数

              lea bx,array      ;bx也正是数组的首地址

              lea si,array1

              lea di,array2

        start:mov ax,[bx]

                cmp ax,0        ;是或不是为负数

                js Y            ;是负数

                mov [si],ax      ;存入正数数组

                inc count1

                add si,2

                jmp short next

            Y:  mov [di],ax

                inc count2

                add di,2

            next:add bx,2

                loop start

            lea dx,string1

            mov al,count1

            call print

            lea dx,string2

            mov al,count2       

            call print

            ret

    main endp       

    ;————————————–

    print  proc near

            push ax      ;al中蕴藏计数值,要扩充封存

            mov ah,9

            int 21h

            pop ax        ;出栈,进行ASCII码调整

            aam            ;调治格局AH<-AL/10(商),AL<-AL%10

            push ax

            add ah,30h    ;变为0~9的ASCII码

            mov dl,ah

            mov ah,2

            int 21h

            pop ax

            add al,30h

            mov dl,al

            mov ah,2

            int 21h

            lea dx,CRLF

            mov ah,9

            int 21h

            ret

    print endp

    progrnam ends

            end s

14.设有11个学生的实际业绩分别是76,69,84,90,73,88,99,63,100和80分。试编写制定三个子顺序总括60~69分,70~79分,80~89分,90~99分和100分的人头,分别寄放到S6,S7,S8,S9和S10单元中。

    data segment

        grade dw 76,69,84,90,73,88,99,63,100,80

        count1 dw 0

        count2 dw 0

        count3 dw 0

        count4 dw 0

        count5 dw 0

    data ends

    ;—————————————–

    progrnam segment

            assume ds:data,cs:progrnam

              push ds

              xor ax,ax

              push ax

              mov ax,data

              mov ds,ax

        begin:mov cx,10

        mov si,0

        next:mov ax,grade[si]

            mov bx,10

            div bl

            mov bl,al

            sub bx,6

            sal bx,1    ;将(grade/10-6)×2就是

            inc count1[bx]  ;count1是首地方

            add si,2

        loop next

    progrnam ends

        end begin

15.出口空行

    progrnam segment

            assume cs:progrnam

        begin:push cx

              push dx

              mov ax,3    ;这里对ax进行赋值,观看输出的结果

              mov cx,ax

        print:mov dl,0dh

              mov ah,2    ;那是对与输出二个字符的bios的调用

              int 21h  ;print的机能正是出口空行,0dh为回车

            mov dl,0ah ;0ah为换行

            mov ah,2

            int 21h 

            loop print

            pop dx

            pop cx

        ;这一段程序是为了测验输出后的结果,首要母的是出口三个香艳的’*’

            mov ah,9

            mov al,’*’

            mov bh,0

            mov bl,0eh

            mov cx,1

            int 10h

            ret

    progrnam ends

            end begin

16.冒泡排序

ASSUME CS:CODE,DS:DATA

DATA SEGMENT

        BUF DB 12, 32, -2, 4, 0    ; NUMBER ARRAY BUFFER

        CNT DB $-BUF              ; COUNT FOR BUFFER

DATA ENDS

CODE SEGMENT

START:  MOV AX, DATA

        MOV DS, AX                  ; DATA SEGMENT

        MOV SI, OFFSET BUF          ; BUFFER INDEX

        MOV CL, CNT                ; LOOP COUNT

美高梅手机版4858 ,        DEC CL

        MOV CH, 0

OUTER:                              ; OUTER LOOP

        MOV AL, [SI]                ; BUF[SI]

        PUSH CX

        MOV DI, SI                  ; BUFFER INDEX

INNER:                              ; INNER LOOP

        INC DI                      ; DI = SI + 1

        MOV DL, [DI]                ; BUF[DI]

        CMP AL, DL                  ; IF (BUF[SI] > BUF[DI])

        JLE CONT                    ;

        XCHG AX, DX                ; SWAP (BUF[SI], BUF[DI])

        MOV [SI], AL

        MOV [DI], DL

CONT:  LOOP INNER                  ; CONTINUE

        POP CX

        INC SI

        LOOP OUTER

        MOV AH, 4CH

        INT 21H

CODE ENDS

END STA

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有