汇编8086题 逐行帮我解释一下谢谢!!!!!!!!!!

.model small
.386

DATA SEGMENT

buf db 100, 0 ,100 DUP (0)
msg1 db 'Please input a string: ',0DH,0Ah,'$'
crlf db 0Dh,0Ah,'$'
leng db 0

DATA ENDS

STACK SEGMENT

DB 64 DUP (?)

STACK ENDS

CODE SEGMENT

assume cs:CODE,ds:DATA,es:DATA,ss:STACK

START:
mov ax,DATA
mov ds,ax
mov es,ax

lea dx,msg1 ;输出提示文字
mov ah,09h
int 21h

lea dx,buf
mov ah,0ah ;接受字符串
int 21h;

mov dx,offset crlf
mov ah,09h ;输出字符串中断
int 21h

call count

call nospace;把这行去掉之后是可以实现反向输出的,当然不能 去空格

lea dx,buf
mov bl,leng;新字符串长度送到bl
mov bh,00h
cmp bx,0000h
jnz L1
jz EXIT

L1:
mov dl,buf+1[bx] ;把最后一位送到dl
mov ah,02h ;输出一个字符中断
int 21h
dec bx ;倒着输出字符
jnz l1

EXIT:
mov AH,4CH
int 21H

count:
xor dx,dx
xor cx,cx
lea di,buf
push di
mov al,0

lop:
cmp al,[di]
je done
inc dl
inc di
loop lop

done:
mov leng,dl;把数组长度存至leng
pop di
ret

nospace:
push si
push di
push ax
push bx
push cx

lea si,buf
add si,2 ;读指针si
mov di,si ;写指针di
xor ch,ch
mov cl,[si-1] ;字符数组长度
cld
xor bl,bl ;新的字符长度

L2:
lodsb ;读取字符
cmp al,' '
je L3 ;如果是空格,跳过保存操作
stosb ;保存字符
inc bl ;记录长度
L3:
loop L2
mov leng,bl

pop cx
pop bx
pop ax
pop di
pop si
ret

CODE ENDS
END START

.model small ;小模式编译
.386 ;386保护模式

DATA SEGMENT ;数据段定义,下面的内容你看就明白

buf db 100, 0 ,100 DUP (0)
msg1 db 'Please input a string: ',0DH,0Ah,'$'
crlf db 0Dh,0Ah,'$'
leng db 0

DATA ENDS

STACK SEGMENT ;堆栈段定义

DB 64 DUP (?)

STACK ENDS

CODE SEGMENT ;执行代码段,即程序代码

assume cs:CODE,ds:DATA,es:DATA,ss:STACK

START: ;执行开始
mov ax,DATA ;数据段地址赋值给ax
mov ds,ax ;ds,es都指向数据段开始位置
mov es,ax

lea dx,msg1 ;输出提示文字
mov ah,09h
int 21h

lea dx,buf
mov ah,0ah ;接受字符串
int 21h;

mov dx,offset crlf
mov ah,09h ;输出字符串中断,换行区别输入和输出的内容,防止混淆
int 21h

call count ;计算输入的字符窜长度

call nospace;把这行去掉之后是可以实现反向输出的,当然不能 去空格

lea dx,buf ;下面的语句实现反向输出字符窜。
mov bl,leng;新字符串长度送到bl
mov bh,00h
cmp bx,0000h
jnz L1
jz EXIT

L1:
mov dl,buf+1[bx] ;把最后一位送到dl
mov ah,02h ;输出一个字符中断
int 21h
dec bx ;倒着输出字符
jnz l1

EXIT:
mov AH,4CH
int 21H

count:
xor dx,dx
xor cx,cx
lea di,buf
push di
mov al,0

lop:
cmp al,[di]
je done
inc dl
inc di
loop lop

done:
mov leng,dl;把数组长度存至leng
pop di
ret

nospace: ;去除输入字符窜中的空字符,并保存其长度。
push si
push di
push ax
push bx
push cx

lea si,buf
add si,2 ;读数据开始位置的值即指针到si,di
mov di,si ;写指针di
xor ch,ch
mov cl,[si-1] ;取定义的字符数组长度
cld ;设置方向位
xor bl,bl ;用来保存新的字符长度

L2:
lodsb ;读取字符
cmp al,' '
je L3 ;如果是空格,跳过保存操作
stosb ;保存字符
inc bl ;记录长度
L3:
loop L2
mov leng,bl

pop cx
pop bx
pop ax
pop di
pop si
ret

CODE ENDS
END START
;此程序的目的是把输入的字符窜去掉其中空格后实现反向输出。 不知是否符合你编程的目的。
温馨提示:内容为网友见解,仅供参考
无其他回答

计算机接口技术综合题,题目如下,请各位大虾江湖救急救急!!!_百度...
(3)8086\/8088响应INTR中断请求时,首先在连续的两个总线周期中发出INTA#负脉冲,在第二个INTA#信号期间,中断源经数据总线向8086\/8088送出一字节中断向量“类型码”。8086\/8088收到“类型码”后将其乘4形 成中断向量表的入口,从此地址开始的4个单元中读出中断服务程序的入口地址(IP、CS),8086\/8088从此地址取指令...

计算机的硬件组成
1.运算器:计算机进行算术运算与逻辑运算的主要部件。2.控制器:从存储器中逐条取出指令控制计算机各部件协调工作,其是计算机的指挥中心。3.存储器计算机的存储部件,用于存放原始数据和程序。存储器按8位二进制位或其倍数划分存储单元,每个单元有一个编号,即地址。存储器分为内存储器(主存储器)和外...

世界上第一台电子计算机
世界第一台电子计算机问世是1946年2月15日,世界上第一台通用电子数字计算机“埃尼阿克”(ENIAC)在美国研制成功。美国国防部用它来进行弹道计算。世界上第一台电子计算机用了18000个电子管,占地150平方米,重达30吨,耗电功率约150千瓦,每秒钟可进行5000次运算。ENIAC以电子管作为元器件,电子管计算机...

相似回答