1.例题详解
补码的最小负数
例4.1 写出下面数据段中每个符号或变量所对应的值。
        DATA    SEGMENT
        ORG    1000H
        MAX    EQU OFFH
        ONE    EQU MAX MOD 10
        TWO    EQU ONE x 4
        SIZE    EQU((TWO LT 20H)AND 10H)+10H
        BUF    DB SIZE x 2 DUP(?)
        COUNT  EQU$ - BUF
        DATA    ENDS
    解:    MAX=0FFH
          ONE=05H(ONE为地议的值除以10的余数)
          TWO=14H
          SIZE=20H
          BUF=1000H(BUF为数据段的偏移量地址)
          COUNT=40H
讨论: 伪指令EQU前面的符号一定对应一个确定的值,该符号不占用也不对应内存空间。而数据定义语句DB、DW等要分配内存空间,其前面的符号名一定要对应确切的内存偏移量。符号名SIZE后面是一个表达式,其值要根据表达式的计算来求出,TWO的值<20H,则结果为真,表示为0FFH,再和10H进行“与"运算,结果为10H,加10H,最后的值为20H。若TWO的值>20H,则结果为假,表示为O,再和10H相“与"结果为O,加1OH,最后结果为10H。
例4.2 若有如下定义的数据段:
DATA    SEGMENG
BUFl    DB‘ABCDl’,ODH,OAH,‘$’
BUF2    DW 5 DUP(?)
BUF3    DD 4 DUP(?)
BUF4    DQ 1234567890ABCDEFH
BUF5    DT 2 DUP(?)
BUF6    DB 3 DUP‘ERROR MSG!’,‘S’   
DATA    ENDS
如果DATA为1600H,要求写出BUFl~BUF6的段值、段内偏移量,类型值TYPE,LENGH及SIZE属性值。
解: 由于BUFl~BUF6都在同一个DATA段内,所以它们的段属性返回值是相同的,即
SEG BUFl~SEG BUF6都等于1600H。
段内偏移量属性值如下:
OFFSET BUFl=0000H,    OFFSET BUF2=0008H
OFFSET BUF3=0012H.    OFFSET BUF4=0022H
OFFSET BUF5=002AH,    OFFSET BUF6=003EH
类型值如下:
TYPE BUFl=1,    TYPE BUF2=2
TYPE BUF3=4,    TYPE BUF4=8
TYPE BUF5=10,  TYPE BUF6=l
LENGTH BUFl=l,  LENGTH BUF2=5
LENGTH BUF3=4,  LENGTH BUF4=l
LENGTH BUF5=2,  LENGTH BUF6=3
SIZE BUFl=1,    SIZE BUF2=10
SIZE BUF3=16,  SIZE BUF4=8
SIZE BUF5=20,    SIZE BUF6=3
讨论: 本题要注意数据定义语句DB、DW、DD、DQ、DT等的区别,它们对应的变量对内存单元的分配是不一样的。它们对应的存储单元数(字节单元)分别为1、2、4、8和10个。LENGTH与SIZE是有区别的,当使用DUP时,LENGTH返回分配给该变量的单元数;否则返回值为1。而SIZE的值为TYPE×LENGTH。
例4.3 编一程序,实现多字节组合型BCD码相加。若实现相减,程序应如何修改?若实现多字节二进制数加(减)法又如何修改?
解:
DATA    SEGMENT
NUMl    DB 12H,34H,56H,78H,90H  ;若X=1234567890H 
COUNT    EQU $-NUMl                ;定义该数的长度 
NUM2    DB 98H,87H,76H,65H,54H ;设Y=9887766554H   
SUM      DB COUNT DUP(0)            ;定义BCD和的存储单元 
DATA    ENDS
CODE    SEGMENT
        ASSUME CS:CODE,DS:DATA,ES:DATA
START:  MOV AX,DATA
        MOV DS,AX
        MOV ES,AX
        MOV SI, OFFSET NUMl+COUNT-1    ;SI指向第一个数的低位
        MOV BX, OFFSET NUM2+COUNT-1 ;BX指向第二个数的低位
        MOV DI, OFFSET SUM+COUNT-1  ;DI指向和数SUM的低位
        MOV CX, COUNT                  ;CX为计数器
        CLC                              ;CF=0
        STD                              ;DF=1,地址修改按减量
NEXT:  LODSB                        ;取BCD数据放入AL中
        ADC AL,[BX]                    ;两数相加,要考虑CF
        DAA                            ;BVD码加后调整
        STOSB                            ;存和
        DEC  BX                        ;修改NUM2地址指针
        LOOP NEXT                      ;CX-1,未完继续
        MOV  AH,4CH                    ;返回系统
        INT  21H
CODE  ENDS
        END START
    例4.7  编一程序,统计一个以‘$’结尾的字符串的长度,并要求滤去第一个非空格字符之前的所有空格。
    解   
    DATA    SEGMENT
    STRG    DB‘THE LENGTH…$’  ;定义字符串
    LENG    DW?                    ;存放字符串长度的内存地址
    DATA    ENDS
    CODE    SEGMENT
            ASSUME CS:CODE,DS:DATA
    START:  MOV AX,DATA
            MOV DS,AX            ;给数据段赋初值    .
            MOV SI,OFFSET STRG
            XOR BX,BX            ;BX清O,存放统计的长度
LOP:    MOV AL,[SI]          ;取字符串中的字符到AL中
            INC SI                  ;修改地址,指向下一个字符
            CMP AL,32            ;AL=‘’?,32是空格的ASCII码
            JZ LOP                ;若是空格,取下一字符
NEXT:  CMP AL,‘$’          ;若不是空格,是结束符吗
            JZ OK                  ;若是‘S’,则结束统计    ’
            INC BX                ;若不是结束符,长度加1
            MOV AL,[SI]          ;取下一个字符
            INC SI                  ;修改地址指针
            JMP NEXT              ;继续上述操作
  OK:      MOV IENG,BX          ;若是结束符,存放长度于内存单元
            MOV AH,4CH
            INT 21H
CODE        ENDS
            END START
  讨论: 在编程时,若循环次数是已知时,通常是将循环次数送人CX,,然后用LOOP指令就可以控制循环。但若循环次数是未知时,循环次数将根据给定的某种条件来判定。本题的循环次数是未知的,给定的条件有两个,第一是要到第一个非空格字符,第二是从第一个非空格字符开始统计字符串的长度。所以程序包括两个循环,第一个循环的结束条件是到非空格字符,第二个循环的结束条件是到字符‘$’。
例4.8  已知多位数x(如8个字节)的补码,编一程序求一x的补码。
  解  根据补码的定义,可采用O减去该多位数实现。
  DATA    SEGMENT
  NUM    DQ  1234567890ABCDEFH
  CONT    DW 4
  DATA    ENDS
  CODE    SEGMENT
          ASSUME CS:CODE,DS:DATA
  START: MOV AX,DATA
          MOV DS,AX
          MOV CX,CONT
          MOV SI,OFFSET NUM
          CLC
  NEXT:  XOR AX,AX

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。