|
|
发表于 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
复制代码
这样应该就没有编译错误了。注意,在写汇编语言时,很重要的一点是清晰理解寄存器的使用和指令的效果,特别是对循环和条件跳转的处理。 |
|