Assemble 实验五

任务1:

汇编源代码: 

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends

stack segment
  dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

  • CPU执行程序,程序返回前,data段的数据不变
  • CPU执行程序,程序返回前,cs=076C,ss=076B,ds=076A.
  • 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的短地址为X-1。

任务二:

汇编源代码:

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0, 0
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

  • CPU执行程序,程序返回前,data段的数据不变
  • CPU执行程序,程序返回前,cs=076C,ss=076B,ds=076A.
  • 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的短地址为X-1。

任务三:

汇编源代码:

assume cs:code, ds:data, ss:stack

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0,0
stack ends
end start


  • CPU执行程序,程序返回前,data段的数据不变
  • CPU执行程序,程序返回前,cs=076C,ss=076B,ds=076A.
  • 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的短地址为X-1。​​​​​​​

​​​​​​​任务四:若将1、2、3题中的最后一条伪指令"end start"改为"end",则哪个程序仍然可以正确执行?请说明原因。

    我认为只有第三个程序可以正确执行,start的作用相当于标号,方便程序员不用再去找实际代码段中的内存地址,因此前两个程序中,stack段和data段的设置都在code段之前,因此内存并不是从00开始所以当程序执行时若从偏移地址为0处开始观察,则无法观察到想要的结果。

任务五:

汇编源代码:

assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends

b segment
  db 1,2,3,4,5,6,7,8
b ends

c1 segment  
  db 8 dup(0)
c1 ends	   
code segment
start:
  mov ax,a
  mov ds,ax
  mov ax,b
  mov ss,ax
  mov ax,c1
  mov es,ax
  mov cx,8
  mov bx,0

s:mov al,[bx]
  mov ah,0
  mov dl,ss:[bx]
  mov dh,0
  add al,dl
  mov es:[bx],al
  inc bx
  loop s

  mov ax,4c00h
  int 21h    	
code ends
end start


计算结果:

任务六:

汇编源代码:

assume cs:code
a segment
  dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
  dw 8 dup(0)
b ends

code segment
start: 
  mov ax,a
  mov ds,ax
  mov ax,b
  mov ss,ax
  mov sp,16
  mov cx,8
  mov bx,0

s:mov ax,[bx]
  push ax
  add bx,2
  loop s

  mov ax,4c00h
  int 21h
code ends
end start

实验结果:

实现了前八个字型数据的逆序相加。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值