汇编 习题1

来源:互联网 发布:nginx 访问apche报错 编辑:程序博客网 时间:2024/05/22 13:01
【1】纠错
  • mov cs, ax  错误 立即数,cs不能作为目的操作数,源操作数和目的操作数不能同为存储器
  • mov [2000h], al 可以
  • add [2000h], 40h  错误 用立即数赋值,需要两个操作数大小相等,这里给出的内存地址无法确定大小
  • MUL ax, bx 错误 MUL只有一个操作数
  • AND 184Ch, ax 错误:
  • mov ds, 0 没有指定位置 mov BYTE ptr DS:[0000h], 34h 就可以了
  • INC [BX] 错误 书上讲INC支持寄存器和存储器 但好像试验中只能使用寄存器 : 
  • 数据类型不明确
  • SBB AX, [DX] 必须是基址寄存器BX或者SI  但是答案是可以
  • RCL BX, 1 不知道为什么1可以,2就不行 (搞清楚了,多于一位的移动应放在cl中)
  • POP AL 错, pop只能将栈顶的内容(SP所指单元)的一个字 传送到目的操作数,并将SP内容加2.
  • XCHG BX, 4050H 不能使用立即数和段寄存器作为操作数 
  • CWB 不存在,只有:CBW(将AL符号位扩展到AX) 和CWD(将AX符号位扩展到DX中)
【2】 (SP)=2040H (AX)=12D4H (BX)=36F4H
  •   PUSH AX 后, (SP)= (SP)-2= 203EH
  • PUSH bx, pop ax 后, (SP)=203eH ax=36f4h
【3】 让AL置0的方法:
mov al, 0
xor al, al 最快,不用操作内存
and al, 00h
sub al, al

【4】两种方法实现将(AL)乘以10值送AX的功能
mov ax, 0028h
mov cl, 10
mul clcbw
shl ax, 1
mov bx, ax
shl ax, 1
shl ax, 1
add ax, bx

【5】 写一个程序段,将附加段2000h-2003h四个字节之和送AX
mov al, byte ptr es:[2000h]
add al, byte ptr es:[2001h]
add al, byte ptr es:[2002h]
add al, byte ptr es:[2003h]

【6】假设(DX)=OF7H 变量DATA1中内容为9EH,确定下列每条指令执行后的结果:

  • mov dx, 0f7h
  • mov word ptr ds:[DATA2], 009eh
  • and dx, DATA2 
  • xor dx, data2
  • or dx, data2
  • shl dx, 1
  • xor dx, 0ffh
  • and dx, 0h
  • test dx, 80h
  • test dx, 01h (test与and类似,此处可以用来检测最后1位是否为0,如果dx最后一位为0,则标志符为zf,否则nz,上面的80h可以检测dx最高位,08h可以检测dl的最高位)
【7】 ROR 循环右移: 右移前最低位送最高位和(CF)
RCR 连同CF搞循环右移,移动方向上的第一个总是送cf,cf总是送移动方面上的最后方,这里就是送给最高位。
【8】下面程序段执行后(AL)=? (DL)=? 完成的是什么功能?
mov cl, 4                  
mov al, 48h
mov dl, al
and al, 0fh
or al, 30h
shr dl, cl
or dl, 30h
cl=4;
al=48h;
dl=al;
al前4位=0;
al前4位=3;
dl前4位移到后四位;
dl前4位=3;完成了对48H的拆分,然后每一个前面加了3,为34h,38h得到4,8的ASCII码



原创粉丝点击