鱼C论坛

 找回密码
 立即注册
查看: 576|回复: 10

[已解决]对寻址这块不太懂,不懂怎么改这段代码

[复制链接]
发表于 2023-5-20 21:06:17 | 显示全部楼层 |阅读模式

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

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

x
  1. <ol><li>;定义一个有数字字符的字符串,统计该字符串中数字的个数</li><li>assume cs:code,ds:data</li><li>data segment</li><li>   s1 db 'i123'</li><li>data ends</li><li>stack segment stack</li><li>    db 120 dup(?)</li><li>stack ends</li><li>code segment</li><li>start:</li><li>    mov ax,1000h</li><li>    mov ds,ax</li><li>    mov bx,0</li><li>    mov cx,0                                             ;统计该字符串中数字的个数</li><li>FIRST:   cmp [bx],0030h                               ;判断bx所在地址中的字符的ASCII值是否小于30h</li><li>            jnc NEXT                                 ;不小于30h,则跳转,判断bx所在地址中的字符的ASCII值是否小于40h,小于则说明是数字</li><li>            INC bx</li><li>NEXT:  cmp [bx],0040h                       ;判断bx所在地址中的字符的ASCII值是否小于40h,小于则说明是数字</li><li>         jc YES</li><li>YES:   INC cx                                         ;记录数字的个数</li><li>        INC bx                                  ;验证下一个字符</li><li>          jmp FIRST</li><li>code ends</li><li>end start</li></ol>
复制代码

                               
登录/注册后可看大图
提示这个错误,我试着把bx改成bl,结果又出现了另一个错误,实在不懂怎么改了
最佳答案
2023-5-20 21:08:11
这段代码有一些问题,比如没有定义 org 指令,无法确定程序加载到内存中的地址。可以按照以下方式修改代码:

  1. assume cs:code, ds:data

  2. data segment
  3.     s1 db 'i123'
  4. data ends

  5. stack segment stack
  6.     db 120 dup(?)
  7. stack ends

  8. code segment
  9. start:
  10.     mov ax, @data    ; 初始化数据段寄存器
  11.     mov ds, ax
  12.     mov bx, 0        ; 将字符串 s1 的起始地址赋给 BX
  13.     mov cx, 0        ; 统计该字符串中数字的个数
  14. FIRST:
  15.     mov al, [bx]     ; 取出当前字符,放入 AL 中
  16.     cmp al, 30h      ; 判断 AL 是否小于 '0'
  17.     jc NEXT         ; 如果小于 '0',跳过下一行
  18.     cmp al, 3Ah      ; 判断 AL 是否大于等于 '0' 并且小于等于 '9'
  19.     jna YES         ; 如果是数字,执行 YES 标签处的指令
  20. NEXT:
  21.     inc bx          ; 验证下一个字符
  22.     cmp byte ptr [bx], 0     ; 判断是否已到字符串末尾
  23.     jnz FIRST       ; 如果未到末尾,继续循环
  24. DONE:
  25.     mov cx, cx      ; 计数器中保存的就是数字的个数
  26.     mov ah, 4ch     ; 退出程序
  27.     int 21h
  28. YES:
  29.     inc cx          ; 记录数字的个数
  30.     inc bx          ; 验证下一个字符
  31.     cmp byte ptr [bx], 0     ; 判断是否已到字符串末尾
  32.     jnz FIRST       ; 如果未到末尾,继续循环
  33.     jmp DONE        ; 如果已到末尾,则退出程序
  34. code ends            ; 声明代码段结束

  35. end start           ; 程序入口
复制代码

修改后的代码使用 org 指令来确定程序加载到内存中的地址,使用 mov ax, @data 来初始化数据段寄存器,使用 mov al, [bx] 取出当前字符。同时,如果已经到达字符串末尾,程序需要正确退出,否则会产生错误。具体而言,可能会出现以下问题:

链接错误:在没有定义 org 指令的情况下,链接程序无法确定程序加载到内存中的地址,从而会抛出链接错误。
运行错误:程序中没有正确退出,导致可能发生内存泄漏等问题。
以上是可以解决的一些问题,由于您并没有说明实际运行时出现的错误信息,可能还需要根据具体的错误提示进行调整。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-20 21:06:49 | 显示全部楼层
这段代码的问题在于使用了16位寄存器bx来寻址一个字节的数据,应该使用8位寄存器bl来寻址。同时,程序中的stack segment定义有误,应该是stacks而不是stack。

以下是修改后的代码:
  1. assume cs:code,ds:data,ss:stacks
  2. data segment
  3.     s1 db 'i123'
  4. data ends
  5. stacks segment stack
  6.     db 120 dup(?)
  7. stacks ends
  8. code segment
  9. start:
  10.     mov ax, data
  11.     mov ds, ax
  12.     mov bx, 0
  13.     mov cx, 0
  14. FIRST:
  15.     cmp byte ptr [bx], '0'
  16.     jnc NEXT
  17.     cmp byte ptr [bx], '9'
  18.     ja NEXT
  19.     inc cx
  20. NEXT:
  21.     inc bx
  22.     cmp byte ptr [bx], 0
  23.     jnz FIRST
  24.     mov ah, 4ch
  25.     int 21h
  26. code ends
  27. end start
复制代码

修改后的代码使用了byte ptr来指定寻址的是一个字节,同时使用了8位寄存器bl来寻址。程序还增加了一个判断字符串是否结束的条件,以避免无限循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-5-20 21:07:32 | 显示全部楼层
呃不知道为啥代码变成那样了,好丑
  1. ;定义一个有数字字符的字符串,统计该字符串中数字的个数
  2. assume cs:code,ds:data
  3. data segment
  4.      s1 db 'i123'
  5. data ends
  6. stack segment stack
  7.      db 120 dup(?)
  8. stack ends
  9. code segment
  10. start:
  11.        mov ax,1000h
  12.            mov ds,ax
  13.            mov bx,0
  14.            mov cx,0          ;统计该字符串中数字的个数
  15. FIRST: cmp [bx],0030h      ;判断bx所在地址中的字符的ASCII值是否小于30h
  16.            jnc NEXT           ;不小于30h,则跳转,判断bx所在地址中的字符的ASCII值是否小于40h,小于则说明是数字
  17.            INC bx
  18. NEXT:  cmp [bx],0040h       ;判断bx所在地址中的字符的ASCII值是否小于40h,小于则说明是数字
  19.        jc YES
  20. YES:   INC cx              ;记录数字的个数
  21.        INC bx              ;验证下一个字符
  22.            jmp FIRST
  23. code ends
  24. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 21:08:11 | 显示全部楼层    本楼为最佳答案   
这段代码有一些问题,比如没有定义 org 指令,无法确定程序加载到内存中的地址。可以按照以下方式修改代码:

  1. assume cs:code, ds:data

  2. data segment
  3.     s1 db 'i123'
  4. data ends

  5. stack segment stack
  6.     db 120 dup(?)
  7. stack ends

  8. code segment
  9. start:
  10.     mov ax, @data    ; 初始化数据段寄存器
  11.     mov ds, ax
  12.     mov bx, 0        ; 将字符串 s1 的起始地址赋给 BX
  13.     mov cx, 0        ; 统计该字符串中数字的个数
  14. FIRST:
  15.     mov al, [bx]     ; 取出当前字符,放入 AL 中
  16.     cmp al, 30h      ; 判断 AL 是否小于 '0'
  17.     jc NEXT         ; 如果小于 '0',跳过下一行
  18.     cmp al, 3Ah      ; 判断 AL 是否大于等于 '0' 并且小于等于 '9'
  19.     jna YES         ; 如果是数字,执行 YES 标签处的指令
  20. NEXT:
  21.     inc bx          ; 验证下一个字符
  22.     cmp byte ptr [bx], 0     ; 判断是否已到字符串末尾
  23.     jnz FIRST       ; 如果未到末尾,继续循环
  24. DONE:
  25.     mov cx, cx      ; 计数器中保存的就是数字的个数
  26.     mov ah, 4ch     ; 退出程序
  27.     int 21h
  28. YES:
  29.     inc cx          ; 记录数字的个数
  30.     inc bx          ; 验证下一个字符
  31.     cmp byte ptr [bx], 0     ; 判断是否已到字符串末尾
  32.     jnz FIRST       ; 如果未到末尾,继续循环
  33.     jmp DONE        ; 如果已到末尾,则退出程序
  34. code ends            ; 声明代码段结束

  35. end start           ; 程序入口
复制代码

修改后的代码使用 org 指令来确定程序加载到内存中的地址,使用 mov ax, @data 来初始化数据段寄存器,使用 mov al, [bx] 取出当前字符。同时,如果已经到达字符串末尾,程序需要正确退出,否则会产生错误。具体而言,可能会出现以下问题:

链接错误:在没有定义 org 指令的情况下,链接程序无法确定程序加载到内存中的地址,从而会抛出链接错误。
运行错误:程序中没有正确退出,导致可能发生内存泄漏等问题。
以上是可以解决的一些问题,由于您并没有说明实际运行时出现的错误信息,可能还需要根据具体的错误提示进行调整。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-5-20 21:13:07 | 显示全部楼层
isdkz 发表于 2023-5-20 21:06
这段代码的问题在于使用了16位寄存器bx来寻址一个字节的数据,应该使用8位寄存器bl来寻址。同时,程序中的s ...

感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-20 21:14:10 | 显示全部楼层
陶远航 发表于 2023-5-20 21:08
这段代码有一些问题,比如没有定义 org 指令,无法确定程序加载到内存中的地址。可以按照以下方式修改代码 ...


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 21:14:53 | 显示全部楼层

那可以给我最佳答案吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 21:15:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-20 21:15:55 | 显示全部楼层
陶远航 发表于 2023-5-20 21:14
那可以给我最佳答案吗

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 21:16:27 | 显示全部楼层
陶远航 发表于 2023-5-20 21:08
这段代码有一些问题,比如没有定义 org 指令,无法确定程序加载到内存中的地址。可以按照以下方式修改代码 ...

兄弟加油啊,我追上你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 21:16:52 | 显示全部楼层
sfqxx 发表于 2023-5-20 21:16
兄弟加油啊,我追上你了

追回来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 20:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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