鱼C论坛

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

[已解决]severe

[复制链接]
发表于 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退出程序的系统调用。

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

  1. datasg segment
  2. db 'ibm             ’
  3. db 'dec             ’
  4. db 'dos             ’
  5. db 'vax             ’
  6. datasg ends

  7. codesg segment
  8. assume cs:codesg, ds:datasg
  9. org 100h  ; DOS .com program start at 100h
  10. start:
  11.     mov ax, datasg
  12.     mov ds, ax
  13.     mov bx, 0
  14.     mov cx, 4

  15. s0:
  16.     push cx  ; save outer loop counter
  17.     mov si, 0
  18.     mov cx, 3

  19. s:
  20.     mov al,[bx+si]
  21.     and al, 11011111b
  22.     mov [bx+si], al
  23.     inc si
  24.     loop s

  25.     add bx, 16
  26.     pop cx  ; restore outer loop counter
  27.     loop s0

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

  31. codesg ends
  32. end start
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-7 03:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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