鱼C论坛

 找回密码
 立即注册
查看: 1085|回复: 2

[已解决]severe

[复制链接]
发表于 2023-7-10 16:39:59 | 显示全部楼层 |阅读模式

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

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

x
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,[bx+si]
          and al,11011111b 
          mov [bx+si],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:datasgdatasg segment    db 'ibm'    db 'dec'    db 'dos'    db 'vax'datasg endscodesg segmentstart:    mov ax, datasg    mov ds, ax    mov bx, 0    mov cx, 4    s0:    mov si, 0    mov cx, 3s:    mov al, [bx+si]    and al, 11011111b    mov [bx+si], al    inc si    loop s        add bx, 16    loop s0codesg endsend start
这段代码修正了语法错误,并使用x86汇编语法编写。请注意,这只是根据您提供的代码进行的修正,实际上可能还有其他错误或问题需要解决。如果您需要更详细的帮助,请提供更多相关信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-10 16:40:11 | 显示全部楼层    本楼为最佳答案   
根据您提供的代码,出现了几个错误。首先,指令'ibm     ''dec      '应该用逗号代替空格,如下所示:
db 'ibm',db 'dec',
其次,您使用的汇编指令不符合x86汇编语法。下面是修正后的代码:
assume cs:codesg, ds:datasgdatasg segment    db 'ibm'    db 'dec'    db 'dos'    db 'vax'datasg endscodesg segmentstart:    mov ax, datasg    mov ds, ax    mov bx, 0    mov cx, 4    s0:    mov si, 0    mov cx, 3s:    mov al, [bx+si]    and al, 11011111b    mov [bx+si], al    inc si    loop s        add bx, 16    loop s0codesg endsend start
这段代码修正了语法错误,并使用x86汇编语法编写。请注意,这只是根据您提供的代码进行的修正,实际上可能还有其他错误或问题需要解决。如果您需要更详细的帮助,请提供更多相关信息。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,[bx+si]
    and al, 11011111b
    mov [bx+si], 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

这样应该就没有编译错误了。注意,在写汇编语言时,很重要的一点是清晰理解寄存器的使用和指令的效果,特别是对循环和条件跳转的处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 12:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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