10.18汇编
写在笔记之前
今天一个上午都在做第5个实验,一方面是上午的时间比较少,另一方面也是这个实验的代码量增大。现在来看,我的汇编能力已经有了一点,王爽这本书写的确实是很好,相信能为我的二进制研究打下基础。希望今天能再看完一章。
第七章结束的很快,40分钟左右全部完成
灵活的寻址方式
首先介绍寄存器di,si这两个与bx类似的寄存器,但是不能高低位分开使用。
于是我们有了这样几种寻址方式:
[bx]
[si]
[di]
[立即数]
;以下等价
[bx+si]
[bx][si]
;以上等价
;以下等价
[bx+立即数]
立即数[bx]
;以上等价
;以下等价
[bx+di+5]
5[bx][di]
[bx].5[di]
[bx][di].5
;以上等价
然后有两个运算符and,or
or al,00100000b
与C中的al=al|00100000b等价,同时若al中存的是字母ASCII码,则可以将这个字母变成大写字母
类似的
and al,11011111b
与C中的al=al&11011111b等价,同时若al中存的是字母ASCII码,则可以将这个字母变成小写字母
最后提供了嵌套循环时的cx处理思路,因为loop必须用cx做循环标识符,所以需要保留cx的值,所以可以使用一个栈来保存,具体可以看下面的代码
别的没什么特别的,贴一下本章的实验源码
assume cs:code,ss:stack,ds:data
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
data segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,0
mov cx,4
mov bx,0
s1:
push cx
;备份cx
mov cx,4
mov di,0
s2:
mov al,3[bx][di]
and al,11011111b
mov 3[bx][di],al
inc di
loop s2
add bx,16
pop cx
;还原cx
loop s1
mov ax,4c00h
int 21h
code ends
end start