汇编学习记录(王爽)6章包含多个段的程序、7章
1.如何在代码段中加入一个数据段?
运用DW 命令(define word),开辟n个字型数据。DW一般放在代码段的前面部分,可以CS:0,CS:2,....等方法来获得数据的值。
在书写的汇编程序中,我们可以在代码段开始时加上标识符Start,代表汇编指令的开始,不然编译器会以为我们开辟的数据空间也是指令,造成编译错误。(最后end start)
2.如何在代码段中加入栈
仍然采用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寄存器用不过来,怎么办呢?
放入我们的栈中。我们在程序中需要保存一些数据时,一般不会再使用很多寄存器(寄存器数量有限),我们会把需要保存的数据暂存在栈中。
(将数据段所有字母变成大写)本章实验题目:
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