狂潮丶 发表于 2013-7-24 17:28:56

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 17:28:57

本帖最后由 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
;内存地址的表示方式:段基址:偏移地址,段是人为设置一个起始址,然后可以通过和这个起始地址的相对位置,来定位一个内存单元。
;

沉默的风采 发表于 2013-7-25 08:02:46

上面的解释得真仔细。
页: [1]
查看完整版本: Assembly language 6.1