汇编语言程序设计题目,在线等答案!!!急!

汇编语言程序设计题目,在线等答案!!!急!,第1张

;----------------------------------

;我帮你写了个可以输入的然后统计长度

;若直接统计你题目给定的字符串也可以写一个

;数据段

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

以上就是关于汇编语言程序设计题目,在线等答案!!!急!全部的内容,包括:汇编语言程序设计题目,在线等答案!!!急!、给汇编程序注释、编一汇编程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存