倔强青铜铜 发表于 2023-5-20 21:06:17

对寻址这块不太懂,不懂怎么改这段代码

<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 ,0030h                               ;判断bx所在地址中的字符的ASCII值是否小于30h</li><li>            jnc NEXT                                 ;不小于30h,则跳转,判断bx所在地址中的字符的ASCII值是否小于40h,小于则说明是数字</li><li>            INC bx</li><li>NEXT:cmp ,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>data:image/png;base64,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提示这个错误,我试着把bx改成bl,结果又出现了另一个错误,实在不懂怎么改了

isdkz 发表于 2023-5-20 21:06:49

这段代码的问题在于使用了16位寄存器bx来寻址一个字节的数据,应该使用8位寄存器bl来寻址。同时,程序中的stack segment定义有误,应该是stacks而不是stack。

以下是修改后的代码:

assume cs:code,ds:data,ss:stacks

data segment
    s1 db 'i123'
data ends

stacks segment stack
    db 120 dup(?)
stacks ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov bx, 0
    mov cx, 0

FIRST:
    cmp byte ptr , '0'
    jnc NEXT
    cmp byte ptr , '9'
    ja NEXT
    inc cx
NEXT:
    inc bx
    cmp byte ptr , 0
    jnz FIRST

    mov ah, 4ch
    int 21h

code ends
end start


修改后的代码使用了byte ptr来指定寻址的是一个字节,同时使用了8位寄存器bl来寻址。程序还增加了一个判断字符串是否结束的条件,以避免无限循环。

倔强青铜铜 发表于 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 ,0030h      ;判断bx所在地址中的字符的ASCII值是否小于30h
           jnc NEXT         ;不小于30h,则跳转,判断bx所在地址中的字符的ASCII值是否小于40h,小于则说明是数字
           INC bx
NEXT:cmp ,0040h       ;判断bx所在地址中的字符的ASCII值是否小于40h,小于则说明是数字
       jc YES
YES:   INC cx            ;记录数字的个数
       INC bx            ;验证下一个字符
           jmp FIRST
code ends
end start

陶远航 发表于 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,    ; 取出当前字符,放入 AL 中
    cmp al, 30h      ; 判断 AL 是否小于 '0'
    jc NEXT         ; 如果小于 '0',跳过下一行
    cmp al, 3Ah      ; 判断 AL 是否大于等于 '0' 并且小于等于 '9'
    jna YES         ; 如果是数字,执行 YES 标签处的指令
NEXT:
    inc bx          ; 验证下一个字符
    cmp byte ptr , 0   ; 判断是否已到字符串末尾
    jnz FIRST       ; 如果未到末尾,继续循环
DONE:
    mov cx, cx      ; 计数器中保存的就是数字的个数
    mov ah, 4ch   ; 退出程序
    int 21h
YES:
    inc cx          ; 记录数字的个数
    inc bx          ; 验证下一个字符
    cmp byte ptr , 0   ; 判断是否已到字符串末尾
    jnz FIRST       ; 如果未到末尾,继续循环
    jmp DONE      ; 如果已到末尾,则退出程序
code ends            ; 声明代码段结束

end start         ; 程序入口

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

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

倔强青铜铜 发表于 2023-5-20 21:13:07

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

感谢!{:10_278:}

倔强青铜铜 发表于 2023-5-20 21:14:10

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


陶远航 发表于 2023-5-20 21:14:53

倔强青铜铜 发表于 2023-5-20 21:14


那可以给我最佳答案吗

sfqxx 发表于 2023-5-20 21:15:11

倔强青铜铜 发表于 2023-5-20 21:14


给2#或者4#最佳

sfqxx 发表于 2023-5-20 21:15:55

陶远航 发表于 2023-5-20 21:14
那可以给我最佳答案吗

{:10_250:}

sfqxx 发表于 2023-5-20 21:16:27

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

兄弟加油啊,我追上你了{:10_256:}

陶远航 发表于 2023-5-20 21:16:52

sfqxx 发表于 2023-5-20 21:16
兄弟加油啊,我追上你了

追回来了
页: [1]
查看完整版本: 对寻址这块不太懂,不懂怎么改这段代码