lm68140318 发表于 2023-7-10 16:39:59

severe



assume cs:codesg,ds:datasg
datasg segment
db 'ibm             ’
db 'dec             ’
db 'dos             ’
db 'vax             ’
datasg ends
codesg segment
start:
           mov ax,datasg
           mov ds,ax
           mov bx,0
           mov cx,4
          
        s0:mov si,0
           mov cx,3
          
        s:mov al,
          and al,11011111b
          mov ,al
          inc si
          
          loop s
                    
          add bx,16
          loop s0
          
codesg ends
end start




我的问题: 提示:4severe errors    ??

陶远航 发表于 2023-7-10 16:40:11

根据您提供的代码,出现了几个错误。首先,指令'ibm   '和'dec      '应该用逗号代替空格,如下所示:

db 'ibm',
db 'dec',


其次,您使用的汇编指令不符合x86汇编语法。下面是修正后的代码:

assume cs:codesg, ds:datasg
datasg segment
    db 'ibm'
    db 'dec'
    db 'dos'
    db 'vax'
datasg ends

codesg segment
start:
    mov ax, datasg
    mov ds, ax
    mov bx, 0
    mov cx, 4
   
s0:
    mov si, 0
    mov cx, 3

s:
    mov al,
    and al, 11011111b
    mov , al
    inc si
    loop s
   
    add bx, 16
    loop s0
codesg ends

end start


这段代码修正了语法错误,并使用x86汇编语法编写。请注意,这只是根据您提供的代码进行的修正,实际上可能还有其他错误或问题需要解决。如果您需要更详细的帮助,请提供更多相关信息。

isdkz 发表于 2023-7-10 16:43:09

这段汇编代码中的主要目的是转换存储在数据段中的字符串为大写。我看到这个代码中存在几个错误,我将按照顺序指出:

1. 第一个错误是,在开始执行任何内存操作之前,你需要初始化堆栈段SS和堆栈指针SP 。这是必需的,因为你正在使用loop指令,它依赖于SP 。

2. 第二个错误在于你的循环嵌套。第一个loop指令使用cx寄存器计数,然后每次循环减少它的值。然而,在外部循环s0中,你没有重新设置cx的值为3,这会导致第二次循环开始时cx为0,不再执行内部循环。

3. 第三个错误是你并没有在s0循环完成后恢复bx的值。你应该在s0循环前后保存和恢复bx的值。

4. 最后,你需要正确结束程序。在你的代码中,并没有一个退出点。一个常用的方法是使用 int 21h, AH=4Ch,它是DOS退出程序的系统调用。

对于这四个错误的修正,你的代码应该看起来像这样:

datasg segment
db 'ibm             ’
db 'dec             ’
db 'dos             ’
db 'vax             ’
datasg ends

codesg segment
assume cs:codesg, ds:datasg
org 100h; DOS .com program start at 100h
start:
    mov ax, datasg
    mov ds, ax
    mov bx, 0
    mov cx, 4

s0:
    push cx; save outer loop counter
    mov si, 0
    mov cx, 3

s:
    mov al,
    and al, 11011111b
    mov , al
    inc si
    loop s

    add bx, 16
    pop cx; restore outer loop counter
    loop s0

    ; Exit the program
    mov ah, 4Ch; DOS terminate function
    int 21h; DOS interrupt

codesg ends
end start


这样应该就没有编译错误了。注意,在写汇编语言时,很重要的一点是清晰理解寄存器的使用和指令的效果,特别是对循环和条件跳转的处理。
页: [1]
查看完整版本: severe