鱼C论坛

 找回密码
 立即注册
查看: 478|回复: 3

[已解决]cuowu1

[复制链接]
发表于 2023-8-1 14:44:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x


  1. ;目的;将welcome to masm复制到段地址0B800h

  2. assume cs:code,ds:data

  3. data segment;数据段
  4. db 'welcome to masm'
  5. data ends
  6.   
  7. code segment
  8. start:
  9.                 mov ax, 0B800h
  10.         mov ds, ax
  11.                
  12.                 mov es,data
  13.                
  14.                 mov cx,15
  15.                
  16.         mov bx, 0
  17.       s:mov al,es:[bx]   
  18.             mov ds:[bx],al
  19.         inc bx
  20.                 loop s
  21.                
  22.                 mov ax,4c00h
  23.         int 21h
  24.         
  25.           
  26. code ends
  27. end start

复制代码



我的问题:显示  mov es,data    severe错误  ??

最佳答案
2023-8-1 14:45:03
根据你提供的代码,你遇到了一个错误:mov es, data。实际上,在MASM中,你无法直接将一个标签(如data)赋值给一个段寄存器(如es)。相反,你需要使用指令mov ax, seg datamov es, ax来加载段地址。

以下是修正后的代码:

  1. assume cs:code, ds:data

  2. data segment
  3.     db 'welcome to masm'
  4. data ends

  5. code segment
  6. start:
  7.     mov ax, 0B800h
  8.     mov ds, ax
  9.     mov ax, seg data  ; 加载数据段地址到 AX
  10.     mov es, ax        ; 将 AX 的值赋给 ES
  11.     mov cx, 15
  12.     xor bx, bx        ; 将 BX 清零
  13.   
  14. s:
  15.     mov al, es:[bx]
  16.     mov ds:[bx], al
  17.     inc bx
  18.     loop s

  19.     mov ah, 4Ch
  20.     int 21h

  21. code ends

  22. end start
复制代码


在修正后的代码中,我添加了两行指令mov ax, seg datamov es, ax。这些指令将数据段的段地址加载到 AX 寄存器中,然后将 AX 的值赋给 ES 寄存器。现在,你可以正确地将数据从数据段复制到段地址 0B800h。

如果还有其他问题,请随时告诉我。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-1 14:44:46 | 显示全部楼层
问题出在这一行代码:mov es, data

在MASM汇编语言中,要将一个段地址加载到寄存器中,需要使用SEG运算符。在这种情况下,您需要使用SEG data来将数据段的地址加载到ES寄存器中。因此,将这一行代码修改为mov es, SEG data即可解决问题。

修改后的代码如下:

  1. ;目的;将welcome to masm复制到段地址0B800h

  2. assume cs:code, ds:data

  3. data segment ;数据段
  4. db 'welcome to masm'
  5. data ends

  6. code segment
  7. start:
  8.     mov ax, 0B800h
  9.     mov ds, ax
  10.    
  11.     mov es, SEG data ; 使用SEG运算符加载数据段的地址到ES寄存器
  12.    
  13.     mov cx, 15
  14.     mov bx, 0
  15. s:
  16.     mov al, es:[bx]   
  17.     mov ds:[bx], al
  18.     inc bx
  19.     loop s
  20.    
  21.     mov ax, 4c00h
  22.     int 21h

  23. code ends
  24. end start
复制代码


现在,您应该能够顺利地将字符串"welcome to masm"复制到段地址0B800h,实现显示的效果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 14:45:03 | 显示全部楼层    本楼为最佳答案   
根据你提供的代码,你遇到了一个错误:mov es, data。实际上,在MASM中,你无法直接将一个标签(如data)赋值给一个段寄存器(如es)。相反,你需要使用指令mov ax, seg datamov es, ax来加载段地址。

以下是修正后的代码:

  1. assume cs:code, ds:data

  2. data segment
  3.     db 'welcome to masm'
  4. data ends

  5. code segment
  6. start:
  7.     mov ax, 0B800h
  8.     mov ds, ax
  9.     mov ax, seg data  ; 加载数据段地址到 AX
  10.     mov es, ax        ; 将 AX 的值赋给 ES
  11.     mov cx, 15
  12.     xor bx, bx        ; 将 BX 清零
  13.   
  14. s:
  15.     mov al, es:[bx]
  16.     mov ds:[bx], al
  17.     inc bx
  18.     loop s

  19.     mov ah, 4Ch
  20.     int 21h

  21. code ends

  22. end start
复制代码


在修正后的代码中,我添加了两行指令mov ax, seg datamov es, ax。这些指令将数据段的段地址加载到 AX 寄存器中,然后将 AX 的值赋给 ES 寄存器。现在,你可以正确地将数据从数据段复制到段地址 0B800h。

如果还有其他问题,请随时告诉我。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 14:45:14 | 显示全部楼层
汇编语言 - mov es, data 错误

在您的代码中,出现了mov es, data导致了严重错误。这是因为在汇编语言中,不能直接将数据段的段名(如data)赋值给段寄存器(如es)。需要使用一个寄存器作为中间步骤。

以下是修正后的代码:

  1. assembly
  2. assume cs:code, ds:data
  3. data segment ; 数据段
  4.     db 'welcome to masm'
  5. data ends

  6. code segment
  7. start:
  8.     mov ax, 0B800h ; 将段地址0B800H赋值给AX寄存器
  9.     mov ds, ax ; 将AX中的值赋值给DS寄存器

  10.     mov si, offset data ; 将数据段的偏移地址赋值给SI寄存器
  11.     mov di, 0B800h ; 将段地址0B800H赋值给DI寄存器
  12.     mov cx, 15 ; 设置循环次数

  13.     s:
  14.         mov al, [si] ; 将SI指向的内存中的值赋值给AL寄存器
  15.         mov [di], al ; 将AL寄存器中的值写入DI指向的内存中
  16.         inc si ; 增加SI指针的值,指向下一个字符
  17.         inc di ; 增加DI指针的值,指向下一个字符
  18.         loop s ; 循环直到CX寄存器的值为零

  19.     mov ax, 4c00h
  20.     int 21h
  21. code ends

  22. end start
复制代码


在修正后的代码中,我使用了两个新的寄存器:sidi。首先,将数据段的偏移地址赋值给si寄存器,然后将段地址0B800H赋值给di寄存器。接下来,使用[si][di]来访问内存中的值,并进行对应的读写操作。

希望以上回答能够解决您的问题!如果您还有其他疑问,请随时提出。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 05:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表