lm68140318 发表于 2023-8-1 14:15:14

错误



assume cs:code,ds:data

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

code segment
start:
                mov ax, 0B800h
      mov ds, ax
               
                mov si,data
               
                mov cx,15
               
      mov bx, 0
      s:mov byte ptr ,si:   
      inc bx
                loop s
      
          
code ends
end start



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


isdkz 发表于 2023-8-1 14:15:29

问题分析:根据提供的汇编代码,您似乎正在尝试使用MASM(Microsoft Macro Assembler)编译汇编程序。从您提供的代码来看,存在一个严重错误。

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

在这行代码中:
s:mov byte ptr ,si:


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

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

s:mov byte ptr , ds:


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

修正后的代码如下:

assume cs:code, ds:data

data segment
    db 'welcome to masm'
data ends

code segment
start:
    mov ax, 0B800h
    mov ds, ax

    mov si, offset data
    mov cx, 15
    mov bx, 0

s:
    mov al, ds:
    mov byte ptr , al
    inc bx
    loop s

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

code ends
end start


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

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

希望这可以解决您的问题!如果您还有其他疑问,请随时提问。

学习编程中的Ben 发表于 2023-8-1 14:15:30

根据提供的汇编代码,严重错误可能出现在以下行:

```assembly
s: mov byte ptr , si:
```

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

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

```assembly
s:
mov al, byte ptr
mov byte ptr , al
inc bx
loop s
```

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

请尝试使用修改后的代码,看看是否解决了严重错误。如果还有其他问题,请随时提问。

陶远航 发表于 2023-8-1 14:15:46

根据你提供的MASM汇编代码,出现错误的原因是在mov byte ptr ,si:这行代码中存在语法错误。在MASM中,你需要使用两个不同的指令来将数据从一个地址复制到另一个地址。

以下是修正后的代码:

assume cs:code, ds:data

data segment
    db 'welcome to masm'
data ends

code segment
start:
    mov ax, 0B800h
    mov ds, ax
    mov si, offset data; 将数据段的偏移地址赋给si寄存器
    mov di, 0; 目标地址,这里设置为0
    mov cx, 15; 循环计数器

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

    mov ah, 4Ch
    int 21h

code ends

end start


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

请注意,在汇编语言中,你需要确保正确设置段寄存器(如在mov ax, 0B800h和mov ds, ax中所示),并使用合适的偏移地址来访问数据段(如在mov si, offset data中所示)。
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-8-1 14:18:32

根据你提供的代码,存在一处严重错误。在指令mov byte ptr ,si:中,使用了si作为源操作数的寄存器。在MASM汇编语言中,不允许直
接将寄存器作为内存操作数的前缀。正确的写法是使用ds:si来指定源操作数的内存地址。

下面是修改后的代码:

assembly
assume cs:code, ds:data

data segment
    db 'welcome to masm'
data ends

code segment
start:
    mov ax, 0B800h
    mov ds, ax

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

    mov cx, 15
    xor bx, bx ; 将bx清零

s:
    mov al, byte ptr ; 从ds:si+bx的地址读取数据
    mov byte ptr , al    ; 将数据存储到ds:bx的地址
    inc bx
    loop s

code ends
end start


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

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 错误