
;----------------------------------
;我帮你写了个可以输入的然后统计长度
;若直接统计你题目给定的字符串也可以写一个
;数据段
data segment
array db 100 DUP(0) ;数组开辟空间
string1 db "Please input a string ended with $" ;字符串以$结束
string2 db "The length of string is: $"
crlf db 13,10,13,10,"$" ;13回车,10换行
data ends
;
;代码段
code segment
assume ds:data,cs:code ;段对应关系的说明
main proc far ;far子程序调用时的参数
;-----------------------------------------
start:
push ds
sub ax,ax
push ax
;-------------------------------------------------
mov ax,data ;将数据传送如数据段
mov ds,ax
;---------------------------------------
;主程序开始
;---------------------------------------------------------
;显示"Please input a string ended with $"的内容
mov ah,09h
lea dx,string1
int 21h
mov dl,24h ;显示'$'
mov ah,02h
int 21h
mov dl,3ah ;显示':'
mov ah,02h
int 21h
;----------------------------------------------------------
;键盘输入字符串以$结束
mov bx,offset array ;设定基址
mov di,0
input:
mov ah,01h
int 21h
cmp al,24h ;和'$'进行比较
je next
mov [bx+di],al
inc di
jmp input
next:
mov [bx+di],24h ;存储$符号
;--------------------------------
;统计
mov si,0
mov cl,0
again:
mov al,[bx+si]
cmp al,24h
je next2
inc cl
inc si
jmp again
next2:
mov ah,09h
lea dx,crlf
int 21h
mov ah,09h
lea dx,string2
int 21h
add cl,30h
mov dl,cl
mov ah,02h
int 21h
ret
main endp ;主函数结束
;
code ends ;代码段定义结束
end start ;这个程序段全部结束,程序段不但有代码段还有其他段
在加注释的同时,对程序进行了优化。
data segment
b db 100,0,100 dup(),'$';定义缓冲区,用于0AH号功能调用从键盘接收字符
m1 db 'input a string:$';定义提示信息,用于提示从键盘输入字符
m2 db 'numbers of digital:$';定义提示信息,用于显示数字字符个数
m3 db 'numbers of word:$';定义提示信息,用于显示字母字符个数
m4 db 'other char:$';定义提示信息,用于显示其它字符个数
letter db 0;定义缓冲区,用于存放字母字符个数
digital db 0;定义缓冲区,用于存放数字字符个数
other db 0;定义缓冲区,用于存放其它字符个数
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data;数据段物理定位
mov ds,ax
mov dx,offset m1 ;用9号功能调用提示信息,用于提示从键盘输入字符
mov ah,09h
int 21h
call crif;调用子程序,实现回车换行功能
mov dx,offset b;用0AH号功能调用从键盘接收字符
mov ah,10
int 21h
call crif;调用子程序,实现回车换行功能
mov di,offset B;
INC DI
MOV CL,[DI];将实际接收的字符个数存入CX中
MOV CH,0
XOR BX,BX ;bx清零
nextcmp:INC di
mov al,[di] ;判断接收到缓冲区的字符的情况
cmp al,'0'
jl oth ;小于转其它字符
cmp al,'9'
jg ul ;大于转去判断大写字母
inc digital;'0'-'9'之间,将数字字符个数加1
JMP next;转去处理下一个字符
ul:
cmp al,'A'
jl oth;小于转其它字符
cmp al,'Z'
jg ll;大于转去判断小写字母
inc letter; 'A'-'Z'之间,将字母个数加1
JMP next;转去处理下一个字符
ll:
CMP AL,'a'
JL oth;小于转其它字符
CMP AL,'z'
JG oth;小于转其它字符
INC letter; 'a'-'z'之间,将字母个数加1
JMP next;转去处理下一个字符
oth:
inc other; 将其它字符个数加1
next:
loop nextcmp
PUSH BX
mov dx,offset m2;显示提示信息,用于显示数字字符个数
mov ah,09h
int 21h
mov bl,digital;显示数字字符个数
call disp8;以2位十六进制形式显示
call crif
mov dx,offset m3;显示提示信息,用于显示字母字符个数
mov ah,9
int 21h
mov bl,letter;显示字母字符个数
call disp8
call crif
MOV DX,OFFSET M4;显示提示信息,用于显示其它字符个数
MOV AH,9
INT 21H
mov bl,other;显示其它字符个数
CALL DISP8
mov ah,1;按任意键结束程序
int 21h
mov ax,4c00h;结束程序
int 21h
crif proc near
mov dl,0ah;显示输出换行
mov ah,02h
int 21h
mov dl,0dh;显示输出回车
mov ah,02h
int 21h
ret
crif endp
DISP8 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
disp8 endp
code ends
end start
; 本程序在MASMPlus 12集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:置光标位置
; 入口:DH=行坐标; DL=列坐标
SetCursor Proc Near
PUSH AX
MOV AH,2
INT 10H
POP AX
RET
SetCursor EndP
; -------------------------------------
; 功能:显示输出多个相同的字符
; 入口:AL=要显示的字符,CX=字符次数
Output_Chrs proc Near
push cx
push bx
push ax
xor bx,bx
mov ah,0ah
int 10h
pop ax
pop bx
pop cx
ret
Output_Chrs endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -------------------------------------
Prompt_Num db 'Please input a number(1-9):$'
Press_Key db 13,10,13,10,'Press any key to exit$'
Start: push cs
pop ds
Output Prompt_Num
Input_Num: mov ah,1
int 21h
cmp al,'3'
jb Input_Num
cmp al,'9'
ja Input_Num
and al,0fh
call Output_CTLF ;输入一个回车、换行
call Output_CTLF
xor bx,bx
mov ah,3
int 10h
mov cl,al
xor ch,ch
test cx,1
jnz $+3
inc cx
mov al,''
Disp_Chrs: call SetCursor ;置光标位置
call Output_Chrs ;显示输出多个相同的字符
call Output_CTLF
cmp cx,1
jz Exit_Proc
inc dh
inc dl
dec cx
dec cx
jmp Disp_Chrs
; -------------------------------------
Exit_Proc: Output Press_Key ;提示 *** 作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Score_Table: ;学生成绩存储区
Code ENDS
END Start ;编译到此结束
CRLF MACRO;定义宏
MOV DL,0DH;调用DOS中断字符输出,输出字符ASCLL是0DH,即换行符
MOV AH,02H;中断功能号02H
INT 21H;DOS中断,21H
MOV DL,0AH;调用DOS中断字符输出,输出字符ASCLL是0AH,即回车
MOV,AH,02H;中断功能号02H
INT 21H;;DOS中断,21H
ENDM ;宏定义结束
DATA SEGMENT ;数据段
DATA1 DB 33H,39H,31H,37H,34H
DATA2 DB 36H,35H,30H,38H,32H
DATA ENDS;数据段结束
STACK SEGMENT堆栈段
STA DB 20 DUP()
TOP EQU LENGTH STA ;预定义TOP为STA的长度
STACK ENDS;堆栈段结束
CODE SEGMENT;代码段
ASSUME CS:CODE,DS:STACK,ES:DATA ;指定相关段
START: MOV AX,DATA;把DATA段的段地址赋予AX
MOV DS,AX;通过AX把DATA段地址赋予DS
MOV AX,STACK;把STACK段的段地址赋予AX
MOV SS,AX;通过AX把STACK段地址赋予SS
MOV AX,TOP;把TOP赋予AX
MOV SP,AX;把AX的值赋予栈指针,即让SP指向堆栈段段尾
MOV SI,OFFSET DATA2;把变量DATA2的偏移地址赋予SI
MOV BX,05;把BX赋值为05
CALL DISPL;调用子程序DISPL
CRLF;宏CRLF,即输出换行符
MOV SI,OFFSET DATA1;把变量DATA1的偏移地址赋予SI
MOV BX,05;把BX赋值为05
CALL DISPL;调用子程序DISPL
CRLF;宏CRLF,即输出换行符
MOV DI,OFFSET DATA2;把变量DATA2的偏移地址赋予DI
CALL ADDA;调用子程序ADDA
MOV SI,OFFSET DATA1;把变量DATA1的偏移地址赋予DI
MOV BX,05;把BX赋值为05
CALL DISPL;调用子程序DISPL
CRLF;宏CRLF,即输出换行符
MOV AX,4C00H ;准备调用DOS终端结束程序,功能号4CH,返回值0
INT 21H;调用DOS中断
DISPL PROC NEAR ;子程序DISPL
DS1:MOV AH,02 ;准备调用DOS中断,功能好02,即字符输出
MOV DL,[SI+BX-1];字符的ASCLL代码在[SI+BX-1]中
INT 21H;调用中断
DEC BX;BX值减1
JNZ DS1;条件跳转到DS1,即重复5次
RET;子程序返回
DISPL ENDP;子程序结束
ADDA PROC NEAR;子程序NEAR
MOV DX,SI;SI值赋予DI
MOV BP,DI;DI值赋予BP
MOV BX,05;把BX赋值为05
AD1:SUB BYTE PTR[SI+BX-1],30H;[SI+BX-1]中的数值减30H
SUB BYTE PTR[DI+BX-1],30H;[DI+BX-1]中的数值减30H
DEC BX ;BX值减1
JNZ AD1;条件跳转,即循环5次
MOV SI,DX;把DX的值赋予SI
MOV DI,BP;把BP的值赋予DI
MOV CX,05;把CX赋值为05
CLC;CF标识符清零
AD2: MOV AL,[SI];把[SI]中的值赋予AL
MOV BL,[DI];把[DI]中的值赋予BL
ADC AL,BL;AL=AL+BL
AAA;非压缩BCD码调整
MOV [SI],AL;AL的值赋予[SI]
INC SI;SI=SI+1
INC DI;DI=DI+1
LOOP AD2;循环跳转AD2
MOV SI,DX;SI赋值为DX的值
MOV DI,BP;DI赋值为BP的值
MOV BX,05;BX赋值为05
AD3:ADD BYTE PTR[SI+BX-1],30H;[SI+BX-1]中的数值加30H
ADD BYTE PTR[DI+BX-1],30H;[DI+BX-1]中的数值加30H
DEC BX;BX=BX-1
JNZ AD3;条件跳转到AD3
RET;子程序返回
ADDA ENDP;子程序结束
CODE ENDS;代码段结束
END START;程序结束
1的个数用十进制表示的,程序如下:
;7asm
data segment
string db 3 dup(0),'$' ;保存转换后的余数,初始化为30h,余
;数直接加到对应单元,转化为ascii码
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx , 3F2Eh ;预置dx要显示的值
push dx
mov bx,dx
mov cl,4 ;移位指令中用于指定移位次数的值
mov dh , 0 ;dh用于记录循环次数,正计数
again: rol bx , cl ;循环移位指令,完成显示后bx值不变
;从高位开始显示
mov dl , bl ;当前要显示的4位移至最低位上
and dl , 0fh ;清除高4位
cmp dl , 0ah ;若是0~9,则直接加30H显示;
;若是A~F,则另外再加7(41H-0AH=30H+7)
jb disp
add dl , 7
disp: add dl , 30h ;不能使用OR DL,30H,是因为数值可能为A~F
mov ah , 2
int 21h
inc dh ;记录循环次数,达到4次,即结束。
cmp dh , 4
jnz again
mov ah , 02h ;回车换行
mov dl , 0ah
int 21h
mov ah , 02h
mov dl , 0dh
int 21h
mov ah,02h
mov dl,'1'
int 21h
mov dl,'6'
int 21h
pop dx
xor bl,bl
next1: and dx,dx;若dx为0,移位结束
jz next2
shl dx,1
adc bl,0
jmp next1
next2:next2: mov bh,0
mov cx , 10 ;将bl中数据转换成十进制输出,cx为数制转换的基数
lea si , string+4 ;si指针指向缓冲区末尾,依次减量,使余数倒序排列
mov ax , bx ;要转换的数据保存于ax
next3: mov dx , 0 ;除法转换,要使用32位被除数,dx为无符号数的0扩展,每次除法都要进行扩展
div cx ;除法后,ax为商,准备下次除法;dx为余数,值为0~9,
;dl可以保存于string中,用于显示
add dl , 30h ;将余数转换为字符,保存于si指定的缓冲区中
mov [si] , dl
dec si ;指针修改,准备存放下一个余数
cmp ax , 0 ;直到商为0,转换结束
jz over
jmp next3
over: mov dx , si ;使用09号DOS功能调用,显示转换后的字符串
inc dx
mov ah , 09h
int 21h
mov ax , 4c00h
int 21h
code ends
end start
/////结果如下:16后面的10是1的个数
J:\masm611>7
3F2E
1610
你的程序有两个错误
1。调用mov
ah,0ah
int21h
后dx指向的是缓冲区的开始,不是结尾,因此你加$的位置应该是:缓冲区开始地址+2+输入字节数
2。显示时,dx应该指向字符串的开始,而不是缓冲区的开始,两者差两个字节。
调试好的程序如下:
DATAS
SEGMENT
buffer
db
80
db
0
db
80
dup
(0);此处输入数据段代码
DATAS
ENDS
STACKS
SEGMENT
;此处输入堆栈段代码
STACKS
ENDS
CODES
SEGMENT
ASSUME
CS:CODES,DS:DATAS,SS:STACKS
START:
mov
ah,0ah
mov
dx,seg
buffer
mov
ds,dx
lea
dx,buffer
int
21h
inc
dx
mov
si,dx
mov
cl,byte
ptr
[si]
;输入的字节数
mov
ch,0
add
si,2
add
si,cx
;字符串结尾
mov
byte
ptr
[si],'$'
push
ds
pop
es
mov
di,offset
buffer
mov
ax,0a0dh
;回车换行
stosw
;把缓冲区的开始两个字节填充成回车换行,是为了让结果和输入分别在两行上显示
mov
ah,09h
lea
dx,buffer
int
21h
MOV
AH,4CH
INT
21H
CODES
ENDS
END
START
以上就是关于汇编语言程序设计题目,在线等答案!!!急!全部的内容,包括:汇编语言程序设计题目,在线等答案!!!急!、给汇编程序注释、编一汇编程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)