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);
}
以上就是关于各位大哥帮小弟做个汇编小程序拉,拜托拉,最好有流程图..全部的内容,包括:各位大哥帮小弟做个汇编小程序拉,拜托拉,最好有流程图..、汇编语言的小程序 急!!!、用汇编编一段小程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)