各位大哥帮小弟做个汇编小程序拉,拜托拉,最好有流程图..

各位大哥帮小弟做个汇编小程序拉,拜托拉,最好有流程图..,第1张

DSEG SEGMENT

msgi db "please input a string:$";显示信息,提示输入一串字符

buf db 100,0,100 dup ();输入字符串缓冲区

digit db 100 dup ();数字字符缓冲区

leter db 100 dup ();字母字符缓冲区

other db 100 dup ();其它字符缓冲区

dn db ;数字字符个数

ln db ;字母字符个数

on db ;其它字符个数

msgd db 0dh,0ah,"digits are:$";显示信息,提示数字字符显示

msgl db 0dh,0ah,"leters are:$";显示信息,提示字母字符显示

msgo db 0dh,0ah,"others are:$";显示信息,提示其它字符显示

msgdn db 0dh,0ah,"digits:$";显示信息,提示数字字符个数显示

msgln db 0dh,0ah,"leter :$";显示信息,提示字母字符个数显示

msgon db 0dh,0ah,"other:$";显示信息,提示其它字符个数显示

DSEG ENDS

CSEG SEGMENT

assume cs:CSEG, ds:DSEG

MAIN PROC FAR ;主程序入口

mov ax, dseg

mov ds, ax

lea dx,msgi;显示信息,提示输入一串字符

mov ah,9

int 21h

lea dx,buf;输入字符串

mov ah,0ah

int 21h

lea si,buf

mov cl,[si+1];输入字符实际个数存入CX中

mov ch,0

add si,2;输入字符起始地址存入SI

lea bx,digit;数字字符起始地址存入BX

lea di,leter;字母字符起始地址存入DI

lea bp,other;其它字符起始地址存入BP

fenlei:

mov al,[si];取出一个字符

cmp al,30h;判断该字符是否为数字

jb oth

cmp al,39h

ja ulet

mov [bx],al;若为数字字符,则存入相应缓冲区

inc bx

inc dn;并将数字字符个数加1

jmp next

ulet:

cmp al,41h;判断该字符是否为大写字母

jb oth

cmp al,5ah

ja llet

mov [di],al;若为大写字母字符,则存入相应缓冲区

inc di

inc ln;并将字母字符个数加1

jmp next

llet:

cmp al,61h;判断该字符是否为小写字母

jb oth

cmp al,7ah

ja oth

mov [di],al;若为小写字母字符,则存入相应缓冲区

inc di

inc ln;并将字母字符个数加1

jmp next

oth:

mov ds:[bp],al;为其它字符,则存入相应缓冲区

inc bp

inc on;并将其它字符个数加1

next:

inc si;调整地址,指向下一个字符

loop fenlei;循环次数为实际输入字符个数

mov byte ptr [bx],'$';在数字字符串末尾加'$',目的用9号中断显示该串

mov byte ptr [di],'$';在字母字符串末尾加'$',目的用9号中断显示该串

mov byte ptr ds:[bp],'$';在其它字符串末尾加'$',目的用9号中断显示该串

lea dx,msgd;显示数字字符

mov ah,9

int 21h

lea dx,digit

mov ah,9

int 21h

lea dx,msgl;显示字母字符

mov ah,9

int 21h

lea dx,leter

mov ah,9

int 21h

lea dx,msgo;显示其它字符

mov ah,9

int 21h

lea dx,other

mov ah,9

int 21h

lea dx,msgln;显示数字字符个数

mov ah,9

int 21h

mov bl,dn

call disp;以十进制形式显示个数

lea dx,msgln;显示字母字符个数

mov ah,9

int 21h

mov bl,ln

call disp

lea dx,msgon;显示其它字符个数

mov ah,9

int 21h

mov bl,on

call disp

mov ah,1;按任意键退出

int 21h

mov ax, 4c00h ;程序结束,返回到 *** 作系统系统

int 21h

MAIN ENDP

disp proc near

mov ch,2

rotate:

mov cl,4

rol bl,cl

mov al,bl

and al,0fh

add al,30h

cmp al,3ah

jl printit

add al,7h

printit:

mov dl,al

mov ah,2

int 21h

dec ch

jnz rotate

ret

disp endp

CSEG ENDS

END MAIN

改了后的程序:

DATA SEGMENT

AA1 DB 0C7H,24H

AA2 DB 0ACH,79H

BUF DW 2 DUP()

DATA ENDS

DATA SEGMENT

CODE SEGMENT ;代码段说明指令

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

LEA SI,AA1

LEA DI,AA2

MOV AL,[SI]

MOV BL,[DI]

CLC ;将CF清零,因为下面的运算要用到CF的值

ADD AL,BL

INC SI

INC DI

MOV AH,[SI]

MOV BH,[DI]

ADC AH,BH

LEA DI,BUF

MOV [DI],AX

MOV AX,4C00H ;程序结束退出指令,不能少

INT 21H

CODE ENDS

END START

这程序就是为了实现两个为字数据的加法,先将两个数的低八位取出相加,得到结果存入AL中,但这时要考虑到可能产生向高位产生进位,所以再进行加法前应该把CF清零,既加一句“CLD”,所以在第二次把两个数的高位取出相加时,要用ADC指令,既带进位加法指令,把低位向高位产生的进位加进去。

带注释的都是你给的程序中漏了的部分

写一段给你吧~ 以 7ch中断为例 间隔显示时间自己可以修改~ 在 dally里

assume cs:code

stack segment

db 128 dup(0)

stack ends

code segment

start: push cs

pop ds

mov si,offset s8

mov ax,0

mov es,ax

mov di,200h ;ds:si 指向源地址 es:si指向目的地址

mov cx, offset s9-offset s8

cld

rep movsb

cli

mov word ptr es:[7ch4],200h

mov word ptr es:[7ch4+2],0 ;设置中断向量表

sti

int 7ch ;------->调用安装好的中断例程~ 测试~

mov ax,4c00h

int 21h

s8: push ax

push es

push di

push cx

mov ax,0b800h

mov es,ax

mov di,12160+402

mov cx,9

mov al,31h

s: mov byte ptr es:[di],al

mov byte ptr es:[di+1],2

call dally

inc al

cmp al,99h

ja s1

cmp cx,1

je s1

loop s

s1:mov cx,9

mov al,31h

jmp short s

dally: push ax

push bx

mov ax,0 ;延迟输出时间在此设置

mov bx,5000h

s2: sub ax,1

sbb bx,0

cmp ax,0

jne s2

cmp bx,0

jne s2

pop bx

pop ax

ret

s9: pop cx

pop di

pop es

pop ax

iret

code ends

end start

初值是R3=4么

如果是的话R2,R3的值执行后都是4

AREA test,CODE,READONLY

ENTRY

Loop

MOV R2,#5;

MOV R3,#4;

MOV R4,#3

SUBS R2,R3,R4,LSR #2

Stop

B Stop

END

asm{

mov ax,0B800h

mov es,ax //设置显存的段0b800:0000h

mov al,X //

mov dl,80 //

mul dl //ax = 80 X //每行80个字符,所以

mov dh,0

mov dl,Y //dx = y

add ax,dx // ax = ax + Y//这个时候ax是计算出来要显示位置

在内存中的偏移量

//比如 第三行,第4个字,,内存中的便宜是

// 380+4 = 244位置,,

//因为要显示字符,每个字符占用2个字节位置

//高位为颜色,低位为显示的字符,所以两个都要 2

shl ax,1 // ax = ax 2

shl dx,1 // dx = dx 2

mov di,ax // di = ax

//所以这个时候的di才是真正的内存中的偏移量

////////////////////////

mov ah,Colour//ah = 颜色,上面说了高位是颜色,所以这里设置

mov si,Str //si=str的地址

mov cl,Length

mov ch,0//cx=长度//后面循环次数根据这个长度来,,loop指令和cx配合用的

}

write:

asm{

mov al,[si] //al = 要显示的字符

mov es:[di],ax //显示字符,带颜色

add di,2 //偏移量 + 2

inc si //显示的字符地址+1

loop write //循环写,,

}

short StrLen(const char Str)

{

asm{

mov bx,word ptr[bp+4] //获得str的地址给bx

xor si,si//si= 0;

dec si//si= si - 1,长度计数用也就是初始化为-1,因为后面是先加1的

}

length:

asm{

inc si//长度计数 + 1

cmp byte ptr[bx+si],0 //比较是不是等于字符串结束即0

jne length //不是结束符,跳回到length再来

mov cx,si//吧长度给cx,,最后用cx返回的

}

return _CX;

}

我给你个输入三个数,从小到大输出的:

汇编:

inkey macro nn

mov ah,1h

int 21h

sub al,30h

mov bl,nn

mul bl

add sum,ax

endm

data segment

sum dw 0

str1 dw 0

str2 dw 0

str3 dw 0

buff1 db 0

bu2 db " 1 2 3 4 5 6 7 8 9 A", 0dh,0ah,"$"

data ends

stack segment para stack

db 100 dup()

stack ends

code segment

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

sub1 proc far

start: push ds

mov ax,0

push ax

mov ax,data

mov ds,ax

mov es,ax

inkey 100 ;输入第一个数

inkey 10

inkey 1

mov ax,sum

mov str1,ax

mov sum,0

mov dl," "

mov ah,2h

int 21h

inkey 100 ;输入第二个数

inkey 10

inkey 1

mov ax,sum

mov str2,ax

mov sum,0

mov dl," "

mov ah,2h

int 21h

inkey 100 ;输入第三个数

inkey 10

inkey 1

mov ax,sum

mov str3,ax

mov dl,0dh

mov ah,2h

int 21h

mov dl,0ah

mov ah,2h

int 21h

mov ax,str1 ;三个数比较大小

cmp ax,str2

jae a7

jmp a8

a7: mov bx,str2

mov str2,ax

mov str1,bx

a8: mov ax,str2

cmp ax,str3

jae a9

jmp a11

a9: mov bx,str3

mov str3,ax

mov str2,bx

mov ax,str1

cmp ax,str2

jae a10

jmp a11

a10: mov bx,str2

mov str2,ax

mov str1,bx

a11: mov ax,str1

mov al,ah

call sub3

mov ax,str1

call sub3

mov dl,"H"

mov ah,2h

int 21h

mov dl," "

mov ah,2h

int 21h

xor ah,ah

mov ax,str2

mov al,ah

call sub3

mov ax,str2

call sub3

mov dl,"H"

mov ah,2h

int 21h

mov dl," "

mov ah,2h

int 21h

xor ah,ah

mov ax,str3

mov al,ah

call sub3

mov ax,str3

call sub3

mov dl,"H"

mov ah,2h

int 21h

ret

sub1 endp

SUB2 PROC

cmp al,9

ja g1

add al,"0"

jmp g2

g1: add al,37h

g2: mov dl,al

mov ah,2

int 21h

RET

SUB2 ENDP

SUB3 PROC

mov buff1,al

shr al,1

shr al,1

shr al,1

shr al,1

CALL SUB2

mov al,buff1

and al,0fh

CALL SUB2

RET

SUB3 ENDP

code ends

end start

高级(C语言):

#include<stdioh>

void main()

{

int t;

int a,b,c;

printf("请输入三个整数:\n");

scanf("%d%d%d",&a,&b,&c);

if(a>b)

{

t=a;

a=b;

b=t;

}//a,b交换

if(a>c)

{

t=a;

a=c;

c=t;

}//a,c交换

if(b>c)

{

t=b;

b=c;

c=t;

}//b,c交换

printf("从小到大输出:%d,%d,%d\n",a,b,c);

}

以上就是关于各位大哥帮小弟做个汇编小程序拉,拜托拉,最好有流程图..全部的内容,包括:各位大哥帮小弟做个汇编小程序拉,拜托拉,最好有流程图..、汇编语言的小程序 急!!!、用汇编编一段小程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10216075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存