MOV AL, STR[BX+1] 报错cannot access label through segment registers 怎么办
时间: 2024-03-03 12:48:09 浏览: 23
这个报错的原因是你使用了段寄存器访问标签,这是不被允许的。你需要使用基址寄存器和偏移量来访问标签。
你可以通过将段寄存器与基址寄存器组合来访问标签。例如,如果标签STR位于数据段(DS)中,则可以使用以下指令:
```
MOV AX, DS ; 将数据段地址加载到AX寄存器中
MOV BX, offset STR ; 将STR标签的偏移量加载到BX寄存器中
MOV AL, [BX+1] ; 使用BX寄存器中的偏移量访问STR标签
```
这将加载数据段地址到AX寄存器中,然后将STR标签的偏移量加载到BX寄存器中。最后,使用BX寄存器中的偏移量来访问标签STR。
相关问题
assume cs:code,ds:data data segment db 'welcome to masm!'//定义输出字符串 data ends code segment start: mov ax,data mov ds,ax mov ax,0b800h mov es,ax mov bx,0 mov si,0 mov cx,16 s0:mov al,[bx] mov es:[bx+720h][si],al ;720h=160*11(行)+32(列)*2 屏幕中间为12行33列,前面有11行32列 mov al,2 ;2绿字 mov es:[bx+721h][si],al inc bx inc si loop s0 mov bx,0 mov cx,16 mov si,160 s1: mov al,[bx] mov es:[bx+720h][si],al mov al,36 ;36绿底红字 mov es:[bx+721h][si],al inc bx inc si loop s1 mov bx,0 mov cx,16 mov si,320 s2: mov al,[bx] mov es:[bx+720h][si],al mov al,113 ;113白底蓝字 mov es:[bx+721h][si],al inc bx inc si loop s2 mov ax,4c00h int 21h code ends end start实验分析
这段代码是用MASM汇编语言编写的,功能是在屏幕上输出三行不同颜色的字符串。其中,data segment定义了要输出的字符串,code segment定义了程序的执行流程。
首先,程序将data segment的起始地址存入AX寄存器,然后通过MOV指令将该地址存入DS寄存器中,以便访问data segment中的数据。
接下来,程序将0B800H存入AX寄存器中,这是VGA显卡的显示缓存区起始地址。将AX寄存器中的值存入ES寄存器中,以便访问显存中的数据。
然后,程序使用循环逐个字符地将data segment中的字符串输出到屏幕上。循环的次数为16,即每行输出16个字符。每次循环,程序使用MOV指令将data segment中的字符读入AL寄存器,然后将AL的值存入显存中的对应位置。其中,ES:[BX+720H][SI]表示显存中第11行32列(720=160*11+32*2)+当前行数所在的偏移量。程序在输出每个字符时,使用不同的颜色标记,以实现不同的颜色效果。
最后,程序使用INT 21H调用DOS系统中的退出功能,退出程序的执行。
总的来说,这段代码实现了在屏幕上输出彩色字符串的功能,展示了汇编语言的基本语法和实现方法。
assume cs:code,ds:data data segment db 'welcome to masm!'//定义输出字符串 data ends code segment start: mov ax,data mov ds,ax mov ax,0b800h mov es,ax mov bx,0 mov si,0 mov cx,16 s0:mov al,[bx] mov es:[bx+720h][si],al ;720h=160*11(行)+32(列)*2 屏幕中间为12行33列,前面有11行32列 mov al,2 ;2绿字 mov es:[bx+721h][si],al inc bx inc si loop s0 mov bx,0 mov cx,16 mov si,160 s1: mov al,[bx] mov es:[bx+720h][si],al mov al,36 ;36绿底红字 mov es:[bx+721h][si],al inc bx inc si loop s1 mov bx,0 mov cx,16 mov si,320 s2: mov al,[bx] mov es:[bx+720h][si],al mov al,113 ;113白底蓝字 mov es:[bx+721h][si],al inc bx inc si loop s2 mov ax,4c00h int 21h code ends end start翻译
这是一段汇编语言程序,用于在屏幕上输出字符串“welcome to masm!”并以不同的颜色显示。
程序开始定义了数据段和代码段,并将数据段的地址加载到ax寄存器中,再将其赋值给ds寄存器,以便程序可以访问数据段中的字符串。
接下来,程序将0xb800地址加载到ax寄存器中,并将其赋值给es寄存器,以便程序可以访问显示缓冲区。
程序使用循环将字符串中的每个字符从数据段中读取,并将其写入到显示缓冲区中。程序先将字符写入到显示缓冲区中当前行的开头位置,然后根据不同的颜色要求,将字符的颜色信息写入到该字符下一个位置。程序使用三个循环分别在屏幕的三个区域中显示不同颜色的字符。
最后,程序将4c00h赋值给ax寄存器并调用int 21h中断,退出程序。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)