当前位置:文档之家› 汇编程序注释版

汇编程序注释版

汇编程序注释版
汇编程序注释版

1. 请任意输入一个字符串,将该串倒序后在屏幕上显示。

DATA SEGMENT

BUF DB 0FFH

DB?

DB 0FFH DUP (?)

ANS DB 0DH,0AH,0FDH DUP (?);换行,回车

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:

MOV AX,DATA

MOV DS,AX;固定格式

LEA DX,BUF; 这一步让等一会儿读的字符串的地址存储在DX中

MOV AH,0AH

INT 21H;dos调用,读字符串

LEA SI,BUF[2];送字符串首地址到源变址寄存器SI

MOV AL,BUF[1];送总字符串数到AL

XOR AH,AH;AH清零,相当于MOV AH,0

ADD SI,AX

DEC SI;SI内的内容变为字符串末尾地址

LEA DI,ANS[2];送ANS的首地址到目标变址寄存器DI

XOR CH,CH;清零

MOV CL,BUF[1];将字符串个数送至计数寄存器作为循环次数,以备loop使用,AGAIN:

MOV AL,[SI]

MOV [DI],AL;将源变址寄存器所指内容送至目标寄存器所指位置(第一次就是末尾到开头)

DEC SI;SI的地址指向字符串倒数的前一位

INC DI;DI指向下一位

LOOP AGAIN;循环上述内容,次数为CX内数,即字符串数

MOV BYTE PTR[DI],'$'

LEA DX,ANS;取ANS的EA到DX

MOV AH,09H;调用DOS功能输出ANS内容

INT 21H

MOV AH,4CH

INT 21H;固定

CODE ENDS

ENDSTART

8. 现有一组字符串为data,name,time,file,code,path,user,exit,quit,text,请编写程序从键盘输入4个字符的字符串,若存在将其修改为disk, 并在显示器上显示。

DATA SEGMENT

BUF DB 05H

DB?

DB 05H DUP (?)

STROUT DB 0DH,0AH,'data'

DB 0DH,0AH,'name'

DB 0DH,0AH,'time'

DB 0DH,0AH,'file'

DB 0DH,0AH,'code'

DB 0DH,0AH,'path'

DB 0DH,0AH,'user'

DB 0DH,0AH,'exit'

DB 0DH,0AH,'quit'

DB 0DH,0AH,'text','$'

REPLACE DB'disk'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA

START:

MOV AX,DATA

MOV DS,AX

MOV ES,AX ;源操作数隐含的段寄存器是DS,目标操作数隐含的段寄存器ES LEA DX,BUF ;取BUF的EA到DX,这样输入的字符存储到DX中MOV AH,0AH

INT 21H ;0AH功能读字符串

LEA BX,STROUT[2] ;取预置字符串的首地址到BX(地址都是两个字节,一个字,两个存储单元)

LEA SI,BUF[2] ;取输入字符串首地址到源变址寄存器SI

LEA DI,STROUT[2] ;取预置字符串首地址到目的变址寄存器DI

MOV CX,10 ;设置循环次数十次

AGAIN:

CLD ;置DF零(对应STD),DF为串操作方向标志,为1时,每次字符串操作后SI,DI递减,反之递增

PUSH CX ;CX进栈

MOV CX,4 ;以上是进行字符串操作的准备,进行字符串操作要把字符串长度(4)输入CX,也要设置SI,DI,DF

REPZ CMPSB ;字节形式比较字符串(SI,DI),REPZ为重复前缀,相同时ZF=1,继续执行,不同时ZF=0,停止执行

POP CX ;CX出栈

JNZ NEXT ;JNZ/JNZ功能:ZF=0时(比较结果为不同)跳转至标号处执行;

LEA SI,REPLACE ;取替换字符串(disk)地址(这一步的前提是上一步的JNZ没有执行,即ZF=1,比较结果为相同)

MOV DI,BX ;取此时字符串的首地址地址到DI

MOV DX,4 ;DX=4

SUBAGAIN:

MOV AL,[SI]

MOV [DI],AL;这两步是取disk的首地址移动到此时DI所指的存储器单位(此时的BX)

INC SI

INC DI;一位一位替换

DEC DX

JNZ SUBAGAIN ;DX为零时结束此循环,替换完成

JMP EXIT ;准备打印

NEXT:

LEA SI,BUF[2] ;取输入字符串的第二个字符的地址

ADD BX,6 ;加上存储的回车换行和下四个字符占用的地址

MOV DI,BX;把第二个字符串的首地址送到目的变址寄存器DI

LOOP AGAIN ;再比较,如果还不同就继续如此,直到CX=0,即循环十次之后

EXIT:

LEA DX,STROUT

MOV AH,09H

INT 21H;调用09H功能输出DX内容

MOV AH,4CH

INT 21H

CODE ENDS

ENDSTART

相关主题
相关文档 最新文档