现在的位置: 首页 > 综合 > 正文

汇编 字符串输入输出 源代码及详细解释

2013年09月18日 ⁄ 综合 ⁄ 共 1430字 ⁄ 字号 评论关闭



DATAS  SEGMENT      ;segment和ends是成对使用的伪指令,功能是定义一个段,这是在写可被编译器编译的汇编程序时

;必须使用的,sement是段的开始,ends是结束
buf1   DB "Hello, $"
BBB    DB 31    ;表示缓冲区能容31个字符
      DB ?
      DB 31 DUP (?) ;这里的31是你在数据段开辟的空间,? 表示不对分配的存储单元赋初值
      ;db   :定义字节类型变量的伪指令
      ;dup():重复定义圆括号中指定的初值,次数由前面的数值决定
      ;?:只分配存储空间,不指定初值
      
;CRLF  DB 0AH,0DH,"$";    回车换行 
DATAS ENDS

STACKS SEGMENT 
       DB      200 DUP(?) ;此处输入堆栈段代码
STACKS ENDS

CODES  SEGMENT
       ASSUME CS:CODES,DS:DATAS,SS:STACKS
          ;在程序中段名就相当于一个标号,它代表了段地址,该句是把名称为"DATAS"的段的段地址送入ax
   ;不能直接用mov ds,datas。因为程序中对段名的引用,如mov ds,datas中的datas被编译器处理为一个表示段地址的数值
   ;而8086CPU不允许将一个数值直接送到段寄存器,所以要先把datas送到ax,然后再把ax送到ds
START:  MOV AX,DATAS 
       MOV DS,AX   
       
;INT 21H是命令系统工作的意思,至于做什么工作,就看你往AH里面放了什么代码。

       ;LEA指令的功能是将源操作数、即存储单元的有效地址(偏移地址)传送到目的操作数。 
      
       MOV AH,10      ;10号中断,接收输入字符串,此时dx为存放字符串的有效地址
       LEA DX,BBB  
       INT 21H
       
        ;下面三行是输出"Hello,"
       LEA DX,[buf1]  ;9号中断前提,给参数dx赋值,指定输出字符串所在的有效地址
       MOV AH,9
       INT 21H  
       
         ;下面三行是回车换行
      ; LEA DX,CRLF
      ;  MOV AH,9
      ; INT 21H
       
        ;CL:在移位指令和循环移动指令中,存放移位次数或者循环移位次数。
; SI:在存储器寻址时,作为变址寄存器。在串操作中,作为源串指针?
; SI是十六位的,它不像ax,bx,cx,dx那样可以分为高八位,底八位,所以用mov dl,si和 mov dl,byte ptr si都是错误的
;直接用mov dx,si就行了,这时dx中的dl已经得到了你所要的结果
       MOV CL,BBB+1  ;获取字符串中字符的个数
       LEA SI,BBB+2  ;首地址 间接寻址
         
NEXT:   MOV DX,[SI]  ;以SI中的内容为偏移地址,把该地址送到dx
       MOV AH,2      ;2号中断输出单个字符
       INT 21H

       INC SI     ;输出一个地址后加1
       DEC CL     ;顺便减少输出的次数
       JNZ NEXT    ; 此处输入代码段代码 
  
       ; 把2号调用改为9号调用
       
       ; MOV BL,CL
       ; MOV [SI+BX],'$'
       ; MOV DX,SI
       ; MOV AH,9
       ; INT 21H
       MOV AH,4CH
       INT 21H
CODES  ENDS
    END START
    
  

【上篇】
【下篇】

抱歉!评论已关闭.