
你的程序我基本看懂了,单个子程序都没有大的问题,但是子程序间的参数传递有点乱
改好的程序如下,不一定正确,你可以试试
大家也可以彼此联系,互相交流交流
DSEG SEGMENT
sushu dw 1000 dup();存放素数
msgsushu db "all of sushu are:",'$';显示素数的提示信息
DSEG ENDS
CSEG SEGMENT
assume cs:CODE, ds:DATA
MAIN PROC FAR
call jisuan;将1000以内素数的个数存入COUNT单元中
lea dx,offset msgsushu;显示素数的提示信息
mov ah,09h
int 21h
call dispsushu;显示素数
lp1:mov ah,0bh
int 21h
jz lp1
mov ax, 4c00h ;程序结束,返回到 *** 作系统系统
int 21h
MAIN ENDP
jisuan proc near
mov ax, dseg
mov ds, ax
mov cx,2
lea di,sushu
mov bx,2;求从2到1000的素数、素数个数,BL从2到1000变化
next11:
cmp bx,1000
jae tj
mov cx,2;如果BL不能被DL从2到BL-1整除的话,则BL为素数
next12:
cmp cx,bx
jae next13
mov ax,bx
mov dx,00h
div cx
cmp dx,0
jz next14;整除则不是素数
inc cx
jmp next12
next13:
mov [di],bx;是素数,则存入相应单元中
inc di
inc di
next14:
inc bx
jmp next11
tj:ret
jisuan endp
dispsushu proc near
lea si,sushu
mov cx,00h
next21: mov ax,cx
mov bl,10
div bl
cmp ah,0
jnz next22
mov dl,0dh;每行10个素数,行末加回车换行
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
next22:
mov bx,[si];取出一个素数
call disp10;以十进制形式输出
mov dl,20h;每个素数之间加一个空格,便于区分
mov ah,2
int 21h
inc si
inc si
inc cx
cmp cx,1000
jb next21
ret
dispsushu endp
disp10 proc near;该子程序的作用是将BX中的数以十进制形式输出
push cx
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
pop cx
ret
dec_div proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30h
mov ah,2
int 21h
ret
dec_div endp
disp10 endp
CSEG ENDS
END MAIN
其他错误目前还看不出来,以后看出来了再来更改答案
希望对你有所帮助
这个还不简单#include<stdioh>void main(){ float a,b,c,s;/定义数据类型,数据初始化/s=(ab+c)/a;/计算并把计算结果赋值给s/printf("s=%f\n",s);/输出计算结果/}
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
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;
}
AL=34H BL=78H
ADD AL ,BL
是指AL+BL->AL(和存在AL)
以后AL=0ACH
DAA是转换压缩BCD码的意思
解释一下:
BCD码是把十六进制当十进制用
如34H 是十进制52 用BCD码表示是0101 0010,前四位表示五,后四位表示二
这样可能回产生进位,
ADC AL,BH
是AL+BH+CF(进位标志)->AL
以上就是关于一个汇编语言的小程序,有点乱,有点小错误,哪位大大帮忙整理一下改一下!!谢了全部的内容,包括:一个汇编语言的小程序,有点乱,有点小错误,哪位大大帮忙整理一下改一下!!谢了、用汇编语言编写一个小小程序、各位大哥帮小弟做个汇编小程序拉,拜托拉,最好有流程图..等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)