鱼C论坛

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

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

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

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

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

x
<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 指令,无法确定程序加载到内存中的地址。可以按照以下方式修改代码:
assume cs:code, ds:data

data segment
    s1 db 'i123'
data ends

stack segment stack
    db 120 dup(?)
stack ends

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

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。

以下是修改后的代码:
assume cs:code,ds:data,ss:stacksdata segment    s1 db 'i123'data endsstacks segment stack    db 120 dup(?)stacks endscode segmentstart:    mov ax, data    mov ds, ax    mov bx, 0    mov cx, 0FIRST:    cmp byte ptr [bx], '0'    jnc NEXT    cmp byte ptr [bx], '9'    ja NEXT    inc cxNEXT:    inc bx    cmp byte ptr [bx], 0    jnz FIRST    mov ah, 4ch    int 21hcode endsend start
修改后的代码使用了byte ptr来指定寻址的是一个字节,同时使用了8位寄存器bl来寻址。程序还增加了一个判断字符串是否结束的条件,以避免无限循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

使用道具 举报

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

data segment
    s1 db 'i123'
data ends

stack segment stack
    db 120 dup(?)
stack ends

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

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-11-22 00:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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