10.18汇编

Posted on Oct 18, 2020
Sweet Child O' Mine

写在笔记之前

今天一个上午都在做第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