鱼C论坛

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

[已解决]cuowu1

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

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

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

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

assume cs:code,ds:data

data segment;数据段
db 'welcome to masm'
data ends 
  
 code segment 
 start:
                mov ax, 0B800h
        mov ds, ax
                
                mov es,data
                
                mov cx,15
                
        mov bx, 0
      s:mov al,es:[bx]    
            mov ds:[bx],al
        inc bx
                loop s
                
                mov ax,4c00h
        int 21h
        
          
 code ends 
 end start


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

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

以下是修正后的代码:
assume cs:code, ds:data

data segment
    db 'welcome to masm'
data ends

code segment
start:
    mov ax, 0B800h
    mov ds, ax
    mov ax, seg data  ; 加载数据段地址到 AX
    mov es, ax        ; 将 AX 的值赋给 ES
    mov cx, 15
    xor bx, bx        ; 将 BX 清零
  
s:
    mov al, es:[bx]
    mov ds:[bx], al
    inc bx
    loop s

    mov ah, 4Ch
    int 21h

code ends

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即可解决问题。

修改后的代码如下:
;目的;将welcome to masm复制到段地址0B800h

assume cs:code, ds:data

data segment ;数据段
db 'welcome to masm'
data ends 

code segment 
start:
    mov ax, 0B800h
    mov ds, ax
    
    mov es, SEG data ; 使用SEG运算符加载数据段的地址到ES寄存器
    
    mov cx, 15
    mov bx, 0
s:
    mov al, es:[bx]   
    mov ds:[bx], al
    inc bx
    loop s
    
    mov ax, 4c00h
    int 21h

code ends 
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来加载段地址。

以下是修正后的代码:
assume cs:code, ds:data

data segment
    db 'welcome to masm'
data ends

code segment
start:
    mov ax, 0B800h
    mov ds, ax
    mov ax, seg data  ; 加载数据段地址到 AX
    mov es, ax        ; 将 AX 的值赋给 ES
    mov cx, 15
    xor bx, bx        ; 将 BX 清零
  
s:
    mov al, es:[bx]
    mov ds:[bx], al
    inc bx
    loop s

    mov ah, 4Ch
    int 21h

code ends

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)。需要使用一个寄存器作为中间步骤。

以下是修正后的代码:
assembly
assume cs:code, ds:data
data segment ; 数据段
    db 'welcome to masm'
data ends

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

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

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

    mov ax, 4c00h
    int 21h
code ends

end start

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

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 11:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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