|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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,结果又出现了另一个错误,实在不懂怎么改了
这段代码有一些问题,比如没有定义 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 指令的情况下,链接程序无法确定程序加载到内存中的地址,从而会抛出链接错误。
运行错误:程序中没有正确退出,导致可能发生内存泄漏等问题。
以上是可以解决的一些问题,由于您并没有说明实际运行时出现的错误信息,可能还需要根据具体的错误提示进行调整。
|
|