鱼C论坛

 找回密码
 立即注册
查看: 539|回复: 4

[已解决]错误

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

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

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

x


  1. assume cs:code,ds:data

  2. data segment;数据段
  3. db 'welcome to masm'
  4. data ends
  5.   
  6. code segment
  7. start:
  8.                 mov ax, 0B800h
  9.         mov ds, ax
  10.                
  11.                 mov si,data
  12.                
  13.                 mov cx,15
  14.                
  15.         mov bx, 0
  16.       s:mov byte ptr [bx],  si:[bx]   
  17.         inc bx
  18.                 loop s
  19.         
  20.           
  21. code ends
  22. end start
复制代码



我的问题 :masm时,提示有1处 severe 错误   ?


最佳答案
2023-8-1 14:15:46
根据你提供的MASM汇编代码,出现错误的原因是在mov byte ptr [bx],  si:[bx]这行代码中存在语法错误。在MASM中,你需要使用两个不同的指令来将数据从一个地址复制到另一个地址。

以下是修正后的代码:

  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 si, offset data  ; 将数据段的偏移地址赋给si寄存器
  10.     mov di, 0  ; 目标地址,这里设置为0
  11.     mov cx, 15  ; 循环计数器

  12. s:
  13.     mov al, [si]  ; 从si指向的地址读取一个字节
  14.     mov es:[di], al  ; 将读取的字节存储到es:di指向的地址
  15.     inc si  ; 增加源地址
  16.     inc di  ; 增加目标地址
  17.     loop s  ; 循环,直到cx计数器为0

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

  20. code ends

  21. end start
复制代码


在修正后的代码中,我添加了一个新的寄存器di作为目标地址,使用mov al, [si]将源地址 si 中的数据读取到寄存器 al 中,并通过mov es:[di], al将数据存储到目标地址 es:di 中。然后,我增加了对源地址 si 和目标地址 di 的递增操作,以及使用loop指令来实现循环。最后,我添加了一个退出程序的代码段,在这个例子中使用了INT 21h功能调用。

请注意,在汇编语言中,你需要确保正确设置段寄存器(如在mov ax, 0B800hmov ds, ax中所示),并使用合适的偏移地址来访问数据段(如在mov si, offset data中所示)。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-1 14:15:29 | 显示全部楼层
问题分析:根据提供的汇编代码,您似乎正在尝试使用MASM(Microsoft Macro Assembler)编译汇编程序。从您提供的代码来看,存在一个严重错误。

错误分析:严重错误可能有多个原因,但在这里,我可以看到一个潜在的问题:

在这行代码中:
  1. s:mov byte ptr [bx],  si:[bx]
复制代码


您试图将 si 寄存器中的数据内容,直接作为源操作数来访问。但是,MASM 汇编器不允许这样的用法。应该使用  ds  寄存器作为源操作数的段地址, si  寄存器作为偏移地址。

解决方案:更正这个问题,您需要在 si 寄存器之前加上 ds 作为段地址,如下所示:

  1. s:mov byte ptr [bx], ds:[si+bx]
复制代码


这样就会从 ds 段中的偏移地址 si+bx 处读取数据,并将其写入目标段中的 bx 偏移地址处。

修正后的代码如下:

  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 si, offset data
  10.     mov cx, 15
  11.     mov bx, 0

  12. s:
  13.     mov al, ds:[si+bx]
  14.     mov byte ptr [bx], al
  15.     inc bx
  16.     loop s

  17.     ; 添加程序结束部分
  18.     mov ax, 4C00h
  19.     int 21h

  20. code ends
  21. end start
复制代码


这样应该修复了严重错误,并且程序应该能够正确运行。

请注意,我添加了程序的结束部分,使用 int 21h 调用,以确保程序正常退出。

希望这可以解决您的问题!如果您还有其他疑问,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 14:15:30 | 显示全部楼层
根据提供的汇编代码,严重错误可能出现在以下行:

```assembly
s: mov byte ptr [bx], si:[bx]
```

该行指令尝试将`si:[bx]`地址处的字节内容存储到`[bx]`地址处。然而,在此语法中,不支持使用两个不同的段寄存器同时进行内存引用。这可能导致汇编器报告严重错误。

要解决此问题,您可以使用一个临时寄存器来存储`si:[bx]`的值,然后再将其存储到`[bx]`地址处。以下是修改后的代码:

```assembly
s:
mov al, byte ptr [si+bx]
mov byte ptr [bx], al
inc bx
loop s
```

在上述代码中,我们使用了`al`寄存器作为临时寄存器,首先将`si:[bx]`的内容加载到`al`中,然后将`al`的值存储到`[bx]`的地址处。然后递增`bx`寄存器,并继续循环。

请尝试使用修改后的代码,看看是否解决了严重错误。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 14:15:46 | 显示全部楼层    本楼为最佳答案   
根据你提供的MASM汇编代码,出现错误的原因是在mov byte ptr [bx],  si:[bx]这行代码中存在语法错误。在MASM中,你需要使用两个不同的指令来将数据从一个地址复制到另一个地址。

以下是修正后的代码:

  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 si, offset data  ; 将数据段的偏移地址赋给si寄存器
  10.     mov di, 0  ; 目标地址,这里设置为0
  11.     mov cx, 15  ; 循环计数器

  12. s:
  13.     mov al, [si]  ; 从si指向的地址读取一个字节
  14.     mov es:[di], al  ; 将读取的字节存储到es:di指向的地址
  15.     inc si  ; 增加源地址
  16.     inc di  ; 增加目标地址
  17.     loop s  ; 循环,直到cx计数器为0

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

  20. code ends

  21. end start
复制代码


在修正后的代码中,我添加了一个新的寄存器di作为目标地址,使用mov al, [si]将源地址 si 中的数据读取到寄存器 al 中,并通过mov es:[di], al将数据存储到目标地址 es:di 中。然后,我增加了对源地址 si 和目标地址 di 的递增操作,以及使用loop指令来实现循环。最后,我添加了一个退出程序的代码段,在这个例子中使用了INT 21h功能调用。

请注意,在汇编语言中,你需要确保正确设置段寄存器(如在mov ax, 0B800hmov ds, ax中所示),并使用合适的偏移地址来访问数据段(如在mov si, offset data中所示)。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-1 14:18:32 | 显示全部楼层
根据你提供的代码,存在一处严重错误。在指令mov byte ptr [bx],  si:[bx]中,使用了si作为源操作数的寄存器。在MASM汇编语言中,不允许直
接将寄存器作为内存操作数的前缀。正确的写法是使用ds:si来指定源操作数的内存地址。

下面是修改后的代码:

  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
  9.     mov ds, ax

  10.     mov si, offset data ; 使用offset获取数据段的偏移地址

  11.     mov cx, 15
  12.     xor bx, bx ; 将bx清零

  13. s:
  14.     mov al, byte ptr [si+bx] ; 从ds:si+bx的地址读取数据
  15.     mov byte ptr [bx], al    ; 将数据存储到ds:bx的地址
  16.     inc bx
  17.     loop s

  18. code ends
  19. end start
复制代码


这样修正后的代码应该可以解决你遇到的问题。

值得注意的是,上述代码将字符串中的前15个字符复制到显存地址 0B800h 开始的位置,其中每个字符占两个字节。如果你想复制整个字符串,可以将 mov cx, 15 修改为 mov cx, 14,或者根据实际字符串长度进行修改。另外,xor bx, bx 可以用来将 bx 寄存器清零,在每次循环开始时重新设置偏移地址。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 17:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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