汇编——寻址方式、指令系统及debug的使用

寻址方式、指令系统及Debug的使用

一、DEBUG的使用

A、U、T命令练习,使用如下程序:

Mov ax,1234
Mov bx,ax
Mov ch,56
Mov cl,78
Mov dx,cx

写出实验步骤,观察每条指令运行后相应寄存器及IP的变化

各指令执行后,ax=1234,bx=1234,cx=5600,cx=5678,dx=5678

步骤:进入debug,出现-号提示符后在后面用A命令写入MOV指令,debug把汇编指令翻译成机器码,存入内存,U命令进行反汇编,将机器码变成指令,T命令将指令逐条运行,可分步查看相应寄存器及IP的变化

可在debug中自行运行参照

二、寻址方式练习

1.

 用E命令在200H处顺序放入11,22,aa,bb,55,66,ff
 用A命令在100H处写入指令:
    
     Mov ax,[200]
     Mov bl,[200]
     Mov si,201
     Mov cx,[si]
     Mov dl,[si]
	 输完后单步执行,观察其中各寄存器内容,写出实验步骤

步骤:debug中用E命令在200H处顺序放入11,22,aa,bb,55,66,ff,再用A命令在100H中写入题中所给MOV指令,T命令可将指令单步执行,

题中各指令功能为:

Mov ax,[200]       有效地址为200H的连续两个内存单元内容送给AX
Mov bl,[200]       有效地址为200H的内存单元送给AL
Mov si,201           将字数据0201H传送到si寄存器
Mov cx,[si]           si寄存器所指的内存单元的内容送给CX
Mov dl,[si]          si寄存器所指的内存单元的内容送给DL

各指令单步执行后各寄存器的详细内容变化可自己在debug中运行观察og.csdnimg.cn/20190712172422947.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5NDI1Mg==,size_16,color_FFFFFF,t_70)

2、

用A命令在100H处写入指令:
     Mov bx,2
     Mov ax,200[bx]
     Mov di,5
     Mov dx,200[di]

输完后单步执行,观察其中各寄存器内容,写出实验步骤

步骤:实验步骤同1

各指令功能为:

Mov bx,2             将字数据0002H传送到BX寄存器
Mov ax,200[bx]       操作数的有效地址为BX寄存器中的值加上位移量200H,即有效地址为0202H的连续两个内存单元内容送给AX
Mov di,5             将字数据0005H传送到di寄存器
Mov dx,200[di]       操作数的有效地址为di寄存器中的值加上位移量200H,即有效地址为0205H的连续两个内存单元内容送给AX

实验结果可自行在debug中运行观察。

3、

用E命令在200开始的字节单元顺序放01h,02h,AAh,BBh,EEh,FFh
用A命令在100H处写入指令:
      Mov ax,200
      Mov si,[201]
      Mov ax,si
      Mov ah,0
      Mov si,ax
      Mov cx,200[si]
      Mov bx,0002
      Mov dx,200[bx][si]

运行后DX内容是多少?先分析再上机验证,写出实验步骤

实验步骤:debug中用E命令在200H处顺序放入01h,02h,AAh,BBh,EEh,FFh,再用A命令在100H中写题目中的mov指令,完成后T命令进行单步执行查看各寄存器内容。

各指令功能:

Mov ax,200              将字数据0200H送到AX寄存器中
Mov si,[201]            将有效地址为0201H的内存单元送给si
Mov ax,si               si寄存器内容送ax寄存器中
Mov ah,0                将字节数据0000H送到AX高8位寄存器中
Mov si,ax               AX寄存器内容送si 寄存器中
Mov cx,200[si]          操作数的有效地址为si寄存器中的值加上位移量200H,即有效地址为0202H的连续两个内存单元内容送给CX
Mov bx,0002             将字数据0002H送到BX寄存器中
Mov dx,200[bx][si]    操作数的有效地址为BX寄存器中的值加上si寄存器中的值再加上偏移量200H,即有效地址为0204H的连续两个内存单元内容送给DX

4

用A命令在100H处写入指令:
   mov ah,88
   mov [200],ah
   mov al,99
   mov si,201
   mov [si],al
   mov di,200
   mov dx,[di]
 运行后DX内容是多少?先分析再上机验证,写出实验步骤

最后的结果:9988

实验步骤:debug中用E命令在200H处顺序放入11,22,aa,bb,55,66,ff,再用A命令在100H中写题目中的mov指令,完成后T命令进行单步执行查看各寄存器内容。

各指令功能:

mov ah,88             将字节数据0088H送到AX高8位寄存器中
mov [200],ah         AH寄存器内容送有效地址为0200H的连续两个内存单元
mov al,99             将字节数据0099H送到AX低8位寄存器中
mov si,201            将字数据0201H传送到si寄存器中
mov [si],al           AL寄存器内容送SI寄存器所指的的连续两个内存单元
mov di,200           将字数据0200H送到DI寄存器中
mov dx,[di]           di寄存器所指的内存单元的内容送给dx

各寄存器内容具体变化可自行在debug中运行查看。

用A命令在100H处写入指令:
        Mov ax,1234
        Mov bx,ax
        Mov si,300
        Mov al,[si]

用U命令查看指令及机器码;用E200命令顺序写入:B8 34 12 89 C3 BE 00 02 8A 04

用U200命令查看,这个E200操作是在做什么?

步骤:在debug中用A命令在100H中写入题中所给mov指令,用U命令查看指令及机器码,可得机器码为B8 34 12 89 C3 BE 00 03 8A 04,

用E200命令顺序写入:B8 34 12 89 C3 BE 00 02 8A 04,用U命令查看其指令,发现和u100的第三条指令不同,为MOV SI,0200。

由此可知用a命令写的指令用u100查看之后是将指令翻译成机器码存入内存中。
e命令是将指令的机器码写入内存。

各寄存器内容具体变化可自行在debug中运行查看。

四、堆栈操作

 观察堆栈区、SP及相关寄存器内容。
       Mov ax,8899
       Mov bx,aabb
       Push ax
       Push bx
       Pop ax
       Pop bx
 观察其中各寄存器内容,写出实验步骤

步骤:各指令功能如下:

Mov ax,8899        将字数据8899H送到AX寄存器中
Mov bx,aabb        将字数据aabbH送到BX寄存器中
Push ax            将AX寄存器的内容放入栈中,SP的值减二
Push bx            将BX寄存器的内容放入栈中,SP的值再减二
Pop ax          将栈顶的内容放入AX中,(AX)=aabb,SP的值加二
Pop bx            将栈顶的内容放入BX中,(BX)=8899,SP的值再加二

可自行在debug中运行查看运行结果

五、指令系统
1.

Debug下在200H处写入01、02、03、AA、BB、CC,
在100H处写指令:
  Mov bx,1
  Mov si,3
  Mov ax,200[bx][si]
  Lea di,200[bx][si]

运行后AX及DI的内容是什么,观察验证。

步骤:各指令功能如下:

Mov bx,1                 将立即数0001放入BX寄存器中
Mov si,3                 将立即数0003放入SI寄存器中
Mov ax,200[bx][si]       操作数的有效地址为BX寄存器中的值加上si寄存器中的值再加上偏移量200H,即有效地址为0204H的连续两个内存单元内容送给AX
Lea di,200[bx][si]       将地址传给DI,即(DI)=0204

可自行在debug中运行查看运行结果。

2

在100H处写指令:
   Mov ax,ffff
   Add ax,1

运行后AX为多少,CF、ZF、AF、PF、SF、OF是多少。

ADD影响标志位,运行后标志位变化如下:
(AX)=0000,CF=1,ZF=1,AF=1,PF=1,SF=0,OF=0。

将add ax,1换成Inc ax后呢?

INC指令中不影响CF标志位。如果在a指令中输入INC ax,1系统不会出现错误提示,运行后,CF=1。
(AX)=0000,CF=0,ZF=1,AF=1,PF=1,SF=0,OF=0

3.完成计算12345678H+9abcdef8H。写出实验步骤

步骤:将每个数字的高四位和低四位分别存储到寄存器中。将高四位和高四位相加,低四位和低四位相加。因为低四位相加有进位,所以在高四位进行相加时用ADC指令。

  Mov ax,1234
  Mov bx,5678
  Mov cx,9abc
  Mov dx,def8
  Add bx,dx
  Adc ax,cx

4.有一个16进制数62A0,与以下16进制数分别求和:1234,4321,
CFA0,9D60,每次运算后的结果及SF,ZF,CF,OF各是多少。写出实验步骤

步骤:

将16进制数62A0分别存到四个寄存器中,再和这四个数分别相加。
  与第一个数相加结果为74D4,SF=0,ZF=0,CF=0,OF=0
  与第二个数相加结果为A5C1,SF=1,ZF=0,CF=0,OF=1
  与第三个数相加结果为3240,SF=0,ZF=0,CF=1,OF=0
  与第四个数相加结果为0000,SF=0,ZF=1,CF=1,OF=0

可自行在debug中运行验证结果。

5.变量X、W、Z都是字,设计实验,完成计算Z=W+(Z-X),说明你
为变量分配的地址。写出实验步骤

①为变量分配地址:Z:[200]    X:[202]    W:[204];
②假设W=10,Z=12,X=8;那么Z=W+(Z-X)=14=0EH;
③将数据写入地址-e200 0c 00 08 00 0a 00
④写指令:MOV AX,[200]
		 SUB AX,X
		 ADD AX,W
		 MOV Z,AX;
⑤运行指令,-d200,结果为0E 00,实验正确
posted @ 2023-03-14 21:27  柯星  阅读(155)  评论(0编辑  收藏  举报  来源