Assembly language 6.1
求解释代码~~~检测点6.1 (2)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:assume cs:codesg codesg segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h dw 0,0,0,0,0,0,0,0,0,0 start:mov ax, codesg ;或mov ax, cs mov ss,ax mov sp, 24h ;或mov sp, 36 ;(第一版填1ah或26) mov ax,0 mov ds,ax mov bx,0 mov cx,8 s:push pop cs: ;或 pop ss: add bx,2 loop s mov ax,4c00h int 21h codesg ends end start
本帖最后由 Dardy 于 2013-7-24 20:30 编辑
assume cs:codesg;一个段,代码段codesg
codesg segment
;下面这行数据是需要内存中(0: 0~15)的数据替换的,是本程序的目的。
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
;下面这行,用作栈空间。当作中转站,内存中的数据先入栈,再出栈到上面那行,完成替换。
dw 0,0,0,0,0,0,0,0,0,0
;下面三行完成栈空间的初始化
start:mov ax, codesg ;CS寄存器的初始值即为代码段的基址,所以codesg可为CS
mov ss,ax ;这么一整,寄存器SS和CS的值是一样的,即代码段和栈段的起始地址是一样的,那8个整数处于栈的前部分。
mov sp, 24h ;sp指向了10个0之后的那个内存单元(显然也就是指向了satrt:那行代码中),要用那10个0的所占有的内存作为栈空间,初始时就需要SP指向那段内存的后一个内存单元。
;用于替换的数据在0:0~15,所以把所在的内存作为DS段,也表明了各种段(代码段数据段栈段)并非天然相隔离的内存块,面是人为设置以便于寻址
mov ax,0
mov ds,ax ;设置DS段的基址为0,就有了DS:~DS:和0:0~15为同一段内存。
;循环8次压栈出栈
mov bx,0
mov cx,8
s:push ;DS:入栈,DS:~DS:和0:0~15为同一段内存
pop cs: ;出栈到cs:,本程序只定义了一个代码段codesg,地址CS:的字存放的是0123h,也即本程序的第一个字中的数据为0123h 。亦可用pop ss:,见mov ss,ax 那行注释。
add bx,2;BX加2,开始下一个字的入栈出栈。
loop s
mov ax,4c00h
int 21h
codesg ends
end start
;内存地址的表示方式:段基址:偏移地址,段是人为设置一个起始址,然后可以通过和这个起始地址的相对位置,来定位一个内存单元。
;
上面的解释得真仔细。
页:
[1]