TABLE DW 10,20,30,40,50
;第一句的解释:定义以TABLE为首地址的五个数据; DW指字类型,就好像C语言的基本类型
的功能一样,前面的TABLE则是标识符。
ENTRY DW 3
;第二句的解释:道理同上,看懂一的解释二应该也清楚了。
MOV BX,OFFSET TABLE
;第三句的解释:意思是将TABLE的首地址传送给基址寄存器BX,OFFSET +X符识符,
表示取X的首地址,整个语句的寻址方式为立即数寻址,MOV在这语句中
起传送地址的作用此时BX=TABLE(表示地址)
ADD BX,ENTRY
;第四句的解释:BX = BX+0003H =TABLE+3(0003H是3的十六进制也没什么区别)
MOV AX,[BX]
;第五句的解释:BX是一个寄存器,加上"[BX]"就是BX(从上面我们可以看出BX寄存器里面是地址) 这个地址里包含的内容,些时BX=TABLE+3而[TABLE+3]的内容就是1E00H传送给AX
如果看懂上面的文字后,就可以分析AX为什么是1E00H了:
TABBLE的数是这样的存储的:
10——>000AH 逻辑存储——>0A (TABLE+0)位
20——>0014H 00 (TABLE+1)位
30——>001EH 14 (TABLE+2)位
40——>0028H 00 (TABLE+3)位
50——>0032H 1E (TABLE+4)位
00 (TABLE+5)位
。。。 。。。。
从第五句我们可以看到:
AX=[BX]=[TABLE+3]
而汇编有这样的规定,以低位表示一个字,那么加上高位 (TABLE+4)就组成了一个字了,
而[TABLE+4]单元里的内容是:1EH,则高位与低位一同组成字故AX=1E00H。
说明:在以上的解释过程中用"="即等号只是为了表达简洁而以,汇编中没有等号直接写的。
我感觉整个过程解释的蛮详细了,不知道你看明白了吗?呵呵
MOV AL,[EBX] 将EBX为地址中的内容放到AL中,其中EBX为32位元暂存器,只使用低16位
MOV EAX,table[BX] 应该是talbe:[BX]吧,就是把段地址为table,偏移地址为BX的内容放到EAX中,同上,只使用低16位
MOV AX,[EBX+ESI] 将偏移地址EBX与变址ESI相加,这个和为地址的内容放入AX中
MOV [EDI],[ESI] 将偏移地址为ESI的地址的内容覆盖EDI为地址为地址的内容(与DI和SI不同在于都是32位的寄存器)第二题
源,目标区没有重叠
MOV AX,SEG BUF
MOV DS,AX
MOV AX,SEG TAB
MOV ES,AX
LEA SI,BUF
LEA DI,TAB
MOV CX,200
CLD
REP MOVSW
源,目标有重叠
MOV CX,200
MOV AX,SEG BUF
MOV DS,AX
MOV AX,SEG TAB
MOV ES,AX
LEA SI,BUF
ADD SI,CX
LEA DI,TAB
ADD DI,CX
STD
REP MOVSW
第一题
DATA SEGMENT
TABLE DB 10H,FEH,00H,ABH,78H,99H,12H,30H,00H,46H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS,DATA
START:MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET TABLE
MOV CX,10
MOV DL,0 ;0的个数
MOV DH,0 ;负数个数
MOV AH,0 ;正数个数
AGAIN:MOV AL,[BX]
CMP AL,0
JZ JISHU0 ;等于0转到统计0
SHL AL,1
JC JISHU1 ;(C)=1转到统计负数
INC AH ;正数统计+1
INC BX
LOOP AGAIN
AJMP END1
JISHU1:INC DH
INC BX
LOOP AGAIN
AJMP END1
JISHU0:INC DL
INC BX
LOOP AGAIN
END1:MOV AH,4CH
INT 21H
CODE ENDS
END STARTMOV AL,TABLE+2 在这样的情况下加2那表明 TABLE是一个立即数也就是一个具体的数 然后再加2传送到AL寄存器中,MOV AL,[TABLE+2]这种情况下加2 代表的是 这个具体的数加上2然后访问它的内存单元 这属于直接寻址方式, MOV AL,[1000H+2]这句话和MOV AL,[TABLE+2]是相同的意思,只不过 这里的 TABLE=1000H。 好好理解下!
AH是16位的计数器 它有两种形式AH 与AL 一个是高8位 一个是低8位 AH 时 +2 AL +1,内存中存储单元形式 +2 指的是以字来存储,+1指的是以字节来存储 所以是+2 希望你看后能明白第一行,是以字类型(16位)定义了5个元素的数组TABLE,注意这里的数据默认情况下理解为10进制的
第二行定义了一个字类型的变量ENTRY,初值取3
第三行,是将TABLE的有效地址取到BX寄存器里
第四行,是让BX和ENTRY的值相加,结果保存到BX中
第五行,以字类型取当前数据段中BX指向单元的数据,从前面的内容看,就是从第一行10所在的位置开始,以这个位置为起点,记为0,依次递增,找到第三字节所在的数据,注意,TABLE中每个数据占两个字节,所以就是从20所在的高位字节位置开始取16位信息跨到后一个字的低位字节,取出的数据变换为16进制的字数据,应该是1E00H
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)