栈的操作

(1)将10000H~1000FH这段空间当作栈,初始状态栈是空的(据此设置SS、SP);
(2)设置AX=001AH,BX=001BH;
(3)利用栈,交换AX和BX中的数据。
(下面列出源代码,并截图说明运行的结果)。
源代码:

assume cs:code
code segment
         mov ax,1000h
     mov ss,ax
     mov sp,0010h

     mov ax,001ah
     mov bx,001bh

     push ax
     push bx

     pop ax
     pop bx

         mov ax,4c00h
         int 21h
code ends
end

这里写图片描述
这里写图片描述
这里写图片描述

1)主程序和子程序如下,注释已经加上: ``` buf1 equ 2200h buf2 equ 2250h buf3 equ 22a0h stack segment sp1 db 20 dup(0) stack ends code segment assume cs:code,ss:stack beg proc far start: ; 初始化堆 mov ax,0h mov ds,ax mov ax,stack mov ss,ax ; 写入数据 mov bx,buf1 mov al,0ah call fmov mov bx,buf2 mov al,0bh call fmov mov bx,buf3 mov al,55h call fmov ; 无限循环,程序不会退出 jmp start fmov proc near ; 入口参数:bx表示起始地址,al表示写入的值 mov cx,16 fmov_lop: mov [bx],al inc bx loop fmov_lop ret fmov endp code ends end beg ``` 可以将 `call` 换为 `jmp` 指令,但是这样做需要手动保存和恢复堆指针,增加了程序的复杂度。因此,使用 `call` 更为简单和稳定。子程序的入口参数通过寄存器传递,bx表示起始地址,al表示写入的值。 2)子程序如下: ``` swap proc near ; 入口参数:bx1表示第一个起始地址,bx2表示第二个起始地址 push ax push cx ; 交换数据 mov cx,16 swap_lop: mov al,[bx1] xchg al,[bx2] mov [bx1],al inc bx1 inc bx2 loop swap_lop pop cx pop ax ret swap endp ``` 子程序的入口参数通过寄存器传递,bx1表示第一个起始地址,bx2表示第二个起始地址。 3)如果将程序的前两句改为 `Mov ax,0220h` 和 `Mov ds,ax`,则程序中的 `buf1`、`buf2`、`buf3` 应该定义为: ``` buf1 equ 0000h buf2 equ 0050h buf3 equ 00a0h ``` 因为 `ds` 寄存器被设置为 0220h,意味着数据段的实际起始地址为 02200h,而 `buf1`、`buf2`、`buf3` 相对于数据段的偏移量分别是 0、50h 和 a0h。而在之前的程序中,假设 `ds` 寄存器的值为 0,因此 `buf1`、`buf2`、`buf3` 相对于数据段的偏移量就是它们的实际起始地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值