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 ??
根据您提供的代码,出现了几个错误。首先,指令'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汇编语法编写。请注意,这只是根据您提供的代码进行的修正,实际上可能还有其他错误或问题需要解决。如果您需要更详细的帮助,请提供更多相关信息。 这段汇编代码中的主要目的是转换存储在数据段中的字符串为大写。我看到这个代码中存在几个错误,我将按照顺序指出:
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]