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小时内删除。
发表评论