运行时出现(1) wrong parameters: MOV AX, [Buf]
时间: 2024-03-20 18:39:40 浏览: 16
这个错误通常是因为变量Buf没有在数据段中声明,或者数据段声明的位置不正确,导致程序无法正确读取变量Buf的值。
在emu8086中,可以使用以下方式在数据段中声明变量Buf:
```
DATA SEGMENT
Buf DW 0 ; 声明一个2字节的变量Buf
Buf2 DW 0 ; 声明一个2字节的变量Buf2
DATA ENDS
```
上述代码将在数据段中声明两个2字节的变量Buf和Buf2,可以根据实际情况调整变量的大小。
在程序中,需要在代码段的顶部添加以下语句,将段寄存器DS设置为数据段的段地址:
```
MOV AX, @DATA ; 将数据段的段地址加载到寄存器AX中
MOV DS, AX ; 将寄存器AX的值存放到段寄存器DS中
```
上述语句将加载数据段的段地址并存储到段寄存器DS中,使得程序可以正确访问数据段中的变量。
将上述语句和变量声明语句添加到程序中,并修改程序中的变量读取指令为:
```
MOV AX, [Buf] ; 将变量Buf的值加载到寄存器AX中
```
然后重新编译和运行程序,应该就可以正确地读取变量Buf的值了。
相关问题
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如果将程序的前两句改为: Mov ax,0220h Mov ds,ax 则程序中的 buf1 buf2 buf3应如何定义?
如果将程序的前两句改为 Mov ax,0220h 和 Mov ds,ax,则程序中的 buf1 buf2 buf3 应该定义为:
buf1 equ 0000h:3000h
buf2 equ 0000h:3050h
buf3 equ 0000h:30a0h
因为通过 Mov ax,0220h 和 Mov ds,ax 指令,将 DS 寄存器设置为了 0220h,即段地址为 0220h 的数据段。因此,buf1 buf2 buf3 这些变量的地址应该使用 DS:偏移地址 的形式来表示。由于 DS 寄存器的值为 0220h,因此偏移地址应该分别为 3000h、3050h、30a0h。而在汇编语言中,可以使用 0000h:XXXXh 的形式来表示 DS:XXXXh,因此 buf1 buf2 buf3 的定义应该为上述形式。
如果将程序的前两句改为: Mov ax,0220h Mov ds,ax 则程序中的 buf1 buf2 buf3应如何定义?
如果将程序的前两句改为 `Mov ax,0220h` 和 `Mov ds,ax`,则意味着我们将数据段寄存器 `ds` 的值设置为 `0220h`,而不是原来的 `0000h`。
因此,我们需要根据新的 `ds` 值重新定义缓冲区的地址。因为新的 `ds` 值为 `0220h`,所以我们需要将原来的缓冲区地址 `2200h`、`2250h` 和 `22a0h` 转换为相对于新的 `ds` 值的偏移量。
这里有两种定义方式:
1. 使用相对偏移量,即定义相对于 `ds` 的偏移量:
```
buf1 equ 0000h
buf2 equ 0050h
buf3 equ 00a0h
```
这里的 `0000h`、`0050h` 和 `00a0h` 分别是相对于新的 `ds` 值 `0220h` 的偏移量,对应的实际内存地址为 `02200h`、`02250h` 和 `022a0h`。
2. 使用绝对地址,即直接定义实际的内存地址:
```
buf1 equ 02200h
buf2 equ 02250h
buf3 equ 022a0h
```
这里的 `02200h`、`02250h` 和 `022a0h` 是实际的内存地址,不需要再进行转换。
需要注意的是,在程序中使用这些缓冲区时,要根据定义的方式来选择使用相对偏移量或者绝对地址。例如,如果使用相对偏移量的方式定义了缓冲区,那么在程序中就要使用 `ds:[buf1]`、`ds:[buf2]` 和 `ds:[buf3]` 来访问这些缓冲区。而如果使用绝对地址的方式定义了缓冲区,那么在程序中就可以直接使用 `[buf1]`、`[buf2]` 和 `[buf3]` 来访问这些缓冲区。