一个汇编语言的小程序,有点乱,有点小错误,哪位大大帮忙整理一下改一下!!谢了

一个汇编语言的小程序,有点乱,有点小错误,哪位大大帮忙整理一下改一下!!谢了,第1张

你的程序我基本看懂了,单个子程序都没有大的问题,但是子程序间的参数传递有点乱

改好的程序如下,不一定正确,你可以试试

大家也可以彼此联系,互相交流交流

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

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

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

原文地址:https://54852.com/zz/10130639.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存