永发信息网

帮忙详细解释下这段汇编代码

答案:2  悬赏:50  手机版
解决时间 2021-03-23 08:30
  • 提问者网友:饥饿走向夜
  • 2021-03-22 18:26
帮忙详细解释下这段汇编代码
最佳答案
  • 五星知识达人网友:刀戟声无边
  • 2021-03-22 18:54
STACK SEGMENT STACK;定义堆栈段开始
DB 0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H,;用伪指令db定义一个字节的变量,每个操作数占一个字节,数据依次会写入内存
DB 0B8H,0B9H;以字母开头的十六进制要在前面多加个0,以便于与标示符的区别
DB 0BAH,0BBH,0BCH,0BDH,0BEH,0BFH
DB 10H DUP(00);字节以00h重复16次
STACK ENDS;堆栈段结束
DATA1 SEGMENT;数据段1的开始
DB 0A0H,0A1H,0A2H,0A3H
TABLE DW 0A5A4H;定义字变量TABLE
DB 0A6H,0A7H,0A8H,0A9H,0AAH,0ABH
DB 0ACH,0ADH,0AEH,0AFH
DATA1 ENDS;数据段1的结束
DATA2 SEGMENT;数据段2的开始
DB 0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H
DB 0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH
DATA2 ENDS;数据段2的结束
CODE SEGMENT;代码段的开始
ASSUME CS:CODE, DS:DATA1, ES:DATA2, SS:STACK;段分配伪指令ASSUME
;说明当前那些逻辑段被分别定义为代码段,堆栈段,数据段,附加段
START:MOV AX,DATA1
MOV DS,AX;通过中间寄存器AX把段地址赋值给DS
MOV AX,DATA2
MOV ES,AX;通过中间寄存器AX把段地址赋值给SS,使ES指向DATA2段地址
MOV BX,0004H
MOV CX,0005H
MOV BP,0003H
MOV SI,0002H
MOV DI,0001H;以上5个是将立即数赋值给寄存器,属于立即数寻址
MOV AX,CX;使AX=CX,寄存器寻址
MOV AX,500H
MOV AX,TABLE;把TABLE变量取一个字的内容给AX,需访问存储器,属于存储器寻址
;默认段为DS
MOV AX,ES:[BX];ES段BX偏移的内存单元内容给ES,属于存储器寻址中的寄存器间接寻址

MOV AX,[BX+05H];段地址为DS,偏移地址为BX+05H,BX,si,di默认使用DS段
MOV AX,SS:[BX]+03H;段地址为SS,偏移地址为BX+03H
MOV AX,TABLE[BX];段地址为DS,偏移地址为BX+TABLE
MOV AX,07H[BX];段地址为DS,偏移地址为BX+07H
MOV AX,[BP];段地址为SS,偏移地址为BP,BP默认使用堆栈段
MOV AX,TABLE[BP];段地址为SS,偏移地址为BX+TABLE
MOV AX,08H[BP]
MOV AX,[BP+06H]
MOV AX,DS:[BP+03H];使用了段前缀DS,段地址为DS,偏移地址为BP+03H
MOV AX,[BP]+05H
MOV AX,ES:[SI+03H];使用了段前缀ES,段地址为ES,偏移地址为SI+03H
MOV AX,[DI+06H]
MOV AX,[DI]+05H
MOV AX,TABLE[SI]
MOV AX,[SI]
MOV AX,TABLE[DI]
MOV AX,[SI]+05H;段地址为DS,偏移地址为SI+05H;以上都是寄存器间接寻址
MOV AX,[BX][DI+01H];段地址为DS,偏移地址为BX+DI+01H,属于基址变址寻址
MOV AX,[BX][SI]+03H
MOV AX,TABLE[BX][SI];段地址为DS,偏移地址为BX+SI+TABLE,属于基址变址寻址
MOV AX,ES:[BX][DI];段地址为ES,偏移地址为BX+DI,属于基址变址寻址
MOV AX,[BP][DI+02H]
MOV AX,TABLE[BP][DI];bp默认堆栈段,段地址为SS,偏移地址为BX+DI+TABLE,属于基址变址寻址
MOV AX,ES:[BP][SI]
MOV AX,[BP][SI+05H]
MOV AX,03H[BP][DI]
MOV AX,[BP][SI]
MOV AX,[BP+02H][DI+03H]
MOV AH,4CH;返回DOS,中断调用
INT 21H
CODE ENDS;代码段结束
END START

寻址方式
1.立即寻址:
MOV AH, 80H
MOV ECX,123456H
2.寄存器寻址
MOV EAX, EBX
MOV VARD, EAX
3.直接寻址
MOV BX, [1234H] ,执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么
-->由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;
-->访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存储单元的物理地址:21234H;
-->取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。

由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。
MOV ES:[1000H], AX
4.寄存器间接寻址
MOV BX,[DI]
-->若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
-->有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
5. 基址加变址寻址
MOV BX, [BX+SI]
-->操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和
6.相对基址加变址寻址
MOV AX, [BX+SI+200H]
MOV AX, 1000H[BX+SI]
-->操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和
7. 32位地址的寻址方式
-->但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。
32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。
1、地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存
[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器;

2、默认段寄存器的选用取决于基址寄存器;

3、基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS
全部回答
  • 1楼网友:怀裏藏嬌
  • 2021-03-22 20:17
没什么意思
仅仅是各种寻址方式的练习而已
MOV AH,4CH
INT 21H
提供程序返回
MOV AX,DATA2
MOV ES,AX
使ES指向DATA2段地址
其他就是寻址方式了
AX,BX,CX,DX,BP,SI,DI为数据寄存器
CS,DS,ES,SS为段寄存器
MOV AX,CX
使AX=CX
MOV AX,500H
使AX=500H
MOV AX,ES:[BX]
使AX=ES段BX偏移的内存单元内容
(以后雷同的省略)
MOV AX,SS:[BX]+03H
使AX=SS段(BX+3)内存单元内容(注意,不是[BX]内容+3哦)
MOV AX,TABLE[BP]
使AX=DS段(默认)(BP内容+TABLE段位置)内存单元中的内容
MOV AX,[BX][DI+01H]
使AX=DS段(默认)[BX+DI+1]内存单元内容
反正记住:
[..]表示单元号
MOV AX,后的要么是段地址:偏移,要么是立即数或寄存器,绝对不可能是什么一个单元内容加几再给AX的就可以了
遇到不认识的词(不是指令)基本都是变量或段名,去找
XXXX(名字) DB/DW/DD XXXX
或 XXXX(名字) SEGMENT
就可以了
指令入口从最后 END XXX 可看出
建议看看王爽《汇编语言》
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯