请设计程序,将存储器单元2200h~220fh写入0ah、2250h~225fh写0bh、22a0h~22afh写55h。要求写出主程序和子程序。 参考程序: 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 mov cx,16 fmov_lop: mov [bx],al inc bx loop fmov_lop ret endp code ends end beg 1)写出程序,并进行注释。并说明 能否将call 换为jmp指令, 为什么? 并且指出过程的入口分别用什么寄存器。 2)根据试验资料的程序,编写出一个子程序,要求 能把第一块连续16个地址单元的内容和第二块连续16个地址单元的内容交换。 3) 如果将程序的前两句改为: Mov ax,0220h Mov ds,ax 则程序中的 buf1 buf2 buf3应如何定义?
时间: 2024-02-10 12:10:23 浏览: 181
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` 相对于数据段的偏移量就是它们的实际起始地址。
阅读全文