汇编学习记录(王爽)6章包含多个段的程序、7章

2019-04-18  本文已影响0人  官总哦

1.如何在代码段中加入一个数据段?

\bullet 运用DW 命令(define word),开辟n个字型数据。DW一般放在代码段的前面部分,可以CS:0,CS:2,....等方法来获得数据的值。

\bullet 在书写的汇编程序中,我们可以在代码段开始时加上标识符Start,代表汇编指令的开始,不然编译器会以为我们开辟的数据空间也是指令,造成编译错误。(最后end start)

2.如何在代码段中加入栈

\bullet 仍然采用dw命令,开辟空间0,0,0,......。然后我们在代码段中,将栈顶SS:SP指向栈顶(SS可以直接采用CS,偏移量SP由数据大小计算得出)

七、灵活的定位寻址

1.汇编中,所有的字符数据被转为ASCii码放在内存当中(一个字符占一个字节)

2.更加灵活的寻址方式

(1)[BX+Idata] (=Idata[BX]) 一个变量加一个常数寻址

(2)[BX+DI][BX+SI] (=[BX][DI]) 双变量寻址

(3)[BX+DI+1] (=1[BX][DI]) 双变量加一个常数寻址

3.采用双变量寻址时,一般是做二维数组使用,那我们在遍历二维数组的时候一般需要双重的循坏。可是我们知道汇编中的loop指定CX为计数器,两层循环会使一个CX寄存器用不过来,怎么办呢?

\bullet 放入我们的栈中。我们在程序中需要保存一些数据时,一般不会再使用很多寄存器(寄存器数量有限),我们会把需要保存的数据暂存在栈中。

(将数据段所有字母变成大写)本章实验题目:

assume cs:codesg,ss:stacksg,ds:datasg

datasg segment

    db '1. display      '

    db '2. brows        '

    db '3. replace      '

    db '4. modify       '

datasg ends

stacksg segment

    dw 0,0,0,0,0,0,0,0

stacksg ends

codesg segment

start: mov ax,datasg

        mov ds,ax

        mov ax,stacksg

        mov ss,ax

        mov sp,10H

        mov bx,0

        mov cx,4

S:     push cx

        mov si,0

        mov cx,4

S0:     mov al,ds:[bx+3+si]

        and al,11011111b

        mov ds:[bx+3+si],al

        inc si

        loop

        add bx,16

        pop cx

        loop

        mov ax,4c00H

        int 21H

codesg ends

end start

上一篇下一篇

猜你喜欢

热点阅读