data segment string1 db 'please input score: $' string2 db 'output score : $' string3 db '| max score | $' string4 db '| min score | $' string5 db '| Passers-by | $' string6 db '| Not Passer-by | $' string7 db '| Average score | $' string8 db '+----------------+-------+$' kong db ' $' string9 db ' | $' string0 db 'Press any key to continue...$' pas dw 0000H npa dw 0000H avg dw 0000H num dw 0000H avg2 dw 0000H score dw 60 dup(0) data ends stack segment dw 64 dup(0) stack ends code segment assume cs:code,ds:data,ss:stack main proc far start: t: call ready call input call sort call count call output jmp t main endp ;========================ready============================= ready: mov ax,data mov ds,ax ;ds数据段寄存器 mov ax,stack mov ss,ax ;ss站段寄存器 mov dx,offset string1 mov ah,09h int 21h xor bx,bx ;临时存放输入进来的数 xor cx,cx ; xor si,si ;score的指针 xor di,di ;计数 ret ;==========================input========================== input: mov ah,1 int 21h cmp al,0dh jz over cmp al,20h jz save sub al,30h mov cl,4 shl bx,cl add bl,al jmp input save: mov score[si],bx add si,2 inc di xor bx,bx jmp input over: mov score[si],bx inc di mov dl,0ah mov ah,02h int 21h mov cx,di dec cx xor bx,bx ret ;===========================sort========================= sort: ;bx=0,用冒泡排序,bx为要改变的哪一位的坐标 mov si,2 mov dx,cx cmp2: mov ax,score[bx] cmp ax,score[bx+si] jnc cmp3 ;大于或相等时转 xchg ax,score[bx+si] mov score[bx],ax cmp3: add si,2 dec dx jnz cmp2 add bx,2 ; loop sort mov dx,offset string2 mov ah,09h int 21h sub si,si 注释这段代码
时间: 2023-08-30 14:09:12 浏览: 48
这段代码是一个汇编语言程序,用于输入一组分数并对它们进行排序、统计和输出结果。它包含了一些数据段和代码段,其中包括了一些字符串常量和变量的定义,以及一些处理函数的实现。程序会先输出一个提示信息,然后等待用户输入一组分数,将其存储在一个score数组中,并对其进行排序。接着,程序会统计各种数据,如最高分、最低分、及格人数、不及格人数和平均分,并将结果输出到屏幕上。最后,程序会等待用户按下任意键,然后重新开始整个过程。
相关问题
代码解释:DATA SEGMENT LFCR DB 0AH,0DH,'$' STR1 DB "Please input N ( 1<= N <=500 ) : $" STR2 DB "Please input M ( N<= M <=500 ) : $" STR3 DB 0AH,0DH,"Answer = $" number DW 0 ; N DW 0 ; M DW 0 ; DATA ENDS
这段代码定义了一个数据段(`DATA SEGMENT`),其中包含了以下变量:
- `LFCR`:一个字节的数据,表示回车换行符(`0AH`表示换行,`0DH`表示回车,`'$'`表示字符串的结束符)。
- `STR1`:一个字符串,表示提示用户输入一个介于1到500之间的整数N。
- `STR2`:一个字符串,表示提示用户输入一个大于等于N且小于等于500的整数M。
- `STR3`:一个字符串,表示提示用户输出答案。
- `number`、`N`、`M`:三个字(两个字节)的数据,分别用于存储输入的答案、N和M的值。
在程序运行时,这些变量将存储在内存的数据段中,并可供程序使用。
stack segment stack ends data segment string_1 db 'please input a num: $' string_2 db 0ah,0dh,'the result is : $' result db 0,0 data ends code segment assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,ax lea dx,string_1 mov ah,09h int 21h mov ah,01h int 21h sub al,30h mov cx,2 mov si,offset result+1 mov ah,0 mov bl,10 cmp al,10 jb shuzi sub al,27h shuzi: div bl mov [si],ah dec si mov ah,0 loop shuzi mov si,offset result mov cx,2 lea dx,string_2 mov ah,09h int 21h shuchu: mov dl,[si] add dl,30h mov ah,02h int 21h inc si loop shuchu mov ax,4c00h int 21h code ends end start 每句解释
这是一段汇编语言代码,实现了一个简单的输入数字并输出结果的程序。下面是每句代码的解释:
```
stack segment stack ends
```
定义了栈段。
```
data segment
string_1 db 'please input a num: $'
string_2 db 0ah,0dh,'the result is : $'
result db 0,0
data ends
```
定义了数据段,包括两个字符串和一个用于存储结果的变量。
```
code segment
assume cs:code,ds:data,ss:stack
start:
```
定义了代码段,并将代码段、数据段和栈段进行了关联。
```
mov ax,data
mov ds,ax
```
将数据段的地址存入 AX 寄存器,并将其传递给 DS 寄存器,以便访问数据段。
```
lea dx,string_1
mov ah,09h
int 21h
```
将字符串 string_1 的地址存入 DX 寄存器,调用 DOS 中断 21h 的 09h 功能,将字符串输出到屏幕上。
```
mov ah,01h
int 21h
sub al,30h
```
调用 DOS 中断 21h 的 01h 功能,等待用户输入一个字符,并将其存入 AL 寄存器中。由于用户输入的是 ASCII 码,需要将其转换成数字。将 '0' 的 ASCII 码(30h)减去 AL 中的值即可。
```
mov cx,2
mov si,offset result+1
mov ah,0
mov bl,10
cmp al,10
jb shuzi
sub al,27h
shuzi:
div bl
mov [si],ah
dec si
mov ah,0
loop shuzi
```
将 AL 寄存器中的数字进行分离,并存储到 result 变量中。首先将 CX 寄存器设置为 2,表示需要分离两位数字。将 SI 寄存器设置为 result 变量的第二个字节的地址,以便存储数字。将 BL 寄存器设置为 10,便于进行除法运算。如果用户输入的数字小于 10,直接跳转到 shuzi 标签下的代码。否则,将 AL 寄存器中的值减去 27h,得到对应的数字,并进行除法运算,将商存储到 SI 指向的地址中,将 SI 寄存器减 1,重复该操作直到 CX 寄存器为 0。
```
mov si,offset result
mov cx,2
lea dx,string_2
mov ah,09h
int 21h
shuchu:
mov dl,[si]
add dl,30h
mov ah,02h
int 21h
inc si
loop shuchu
```
将 result 变量中的数字转换成字符串,并输出到屏幕上。首先将 SI 寄存器设置为 result 变量的第一个字节的地址。将 CX 寄存器设置为 2,表示需要输出两个数字。将字符串 string_2 的地址存入 DX 寄存器,调用 DOS 中断 21h 的 09h 功能,将字符串输出到屏幕上。将 DL 寄存器设置为 SI 指向的地址中的值,并加上 30h,得到对应的 ASCII 码。将该值输出到屏幕上,并将 SI 寄存器加 1,重复该操作直到 CX 寄存器为 0。
```
mov ax,4c00h
int 21h
```
结束程序。将 4c00h 存入 AX 寄存器,调用 DOS 中断 21h 的 4Ch 功能,退出程序。