倔强青铜铜 发表于 2023-5-20 19:58:34

汇编语言的一段代码不理解,有很多不懂的地方

assume cs:code
data segment                  ;定义数据段(俺也不太懂它的作用,只知道它可以用来定义变量)
   VARM1 dw ’1‘    ;定义变量VARM1
   VARB db 12 dup(0)   ;同上
   VARM dw 16 dup(0)
data ends
code segment               ;定义代码段
start:mov bl,0               
      mov ax,VARW1      ;怎么感觉把VARW1当成寄存器了,不理解
          add ax,0            ;0和ax相加不还是ax吗?有啥用
          js done               ;有符号就跳转,也就是最高位为“1”就跳转,然后done就可以记下左移次数和结果
GOON: INC bl               ;也就是说,执行完上面的操作之后发现最高位不是“1”就bl自加1?这样不就只加一次吗?万一要移很多次呢?
      add ax,ax               ;左移(为啥?)
          cmp ax,0
done:mov VARM,ax      ;保存左移后的结果
   mov VARB,bl             ;保存左移次数
code ends
end start
;将字变量VARM1中的非零数据左移到最高位为“1”止,
;左移次数存入字节变量VARB中,左移后的结果保存入字变量VARM中
我想实现以上功能,但是我对汇编一窍不通,注释是一点点理解,想请问一下我该怎么根据错误来改正呀

data:image/png;base64,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

isdkz 发表于 2023-5-20 19:59:25

这段汇编代码的作用是将变量VARM1中的非零数据左移,直到最高位为1止,同时记录左移次数和左移后的结果。下面是对代码中一些不理解的地方的解释:

1. 数据段用于定义程序中需要用到的变量,包括全局变量和局部变量等。在这段代码中,VARM1、VARB和VARM都是定义的变量。

2. mov ax, VARW1这一行代码的作用是将变量VARW1中的值赋给寄存器ax。可能是笔误,应该是VARM1。

3. add ax, 0这一行代码的作用是将寄存器ax中的值加上0,实际上没有任何作用,可以直接省略。

4. js done这一行代码的作用是判断ax寄存器中的值是否为负数(即最高位为1),如果是负数则跳转到done处执行相应的操作。

5. INC bl这一行代码的作用是将寄存器bl中的值加1,用于记录左移次数。

6. add ax, ax这一行代码的作用是将寄存器ax中的值左移一位,相当于乘以2。

7. 比较指令cmp ax, 0的作用是将寄存器ax中的值与0进行比较,如果相等则跳转到done处执行相应的操作。

总的来说,这段代码的实现思路是将变量VARM1中的值左移,每左移一次就将左移次数加1,直到最高位为1时停止左移,并将左移后的结果保存到变量VARM中。

倔强青铜铜 发表于 2023-5-20 20:08:45

isdkz 发表于 2023-5-20 19:59
这段汇编代码的作用是将变量VARM1中的非零数据左移,直到最高位为1止,同时记录左移次数和左移后的结果。下 ...

首先感谢解答,还有不明白的是第5点说到INC bl的作用是bl的值+1,记录左移次数,看代码他只执行了一次,是不是代表bl的值最大就是1?{:10_266:}

isdkz 发表于 2023-5-20 20:13:31

倔强青铜铜 发表于 2023-5-20 20:08
首先感谢解答,还有不明白的是第5点说到INC bl的作用是bl的值+1,记录左移次数,看代码他只执行了一次, ...

INC bl 的确只是将 bl 的值增加1,但你需要注意到这一指令在一个循环中。循环开始于 start 标签,并在 GOON 标签的前面结束,条件为当 ax 的最高位为 1 时(即ax为负数时,因为js指令是检测“负数溢出”),它将跳转到 done 标签处。

如果 ax 的最高位不是 1,那么程序就会返回到 GOON,再次执行 INC bl。这个过程会重复,直到 ax 的最高位为 1 为止。因此,INC bl 可能会执行多次,所以 bl 的值可能会大于1,即左移的次数可能会大于1。这也是你提到的“左移到最高位为1”过程的实现方式。

需要注意的是,你的代码里面缺少了循环的跳转部分,你应该在代码中添加 jmp GOON 指令。代码应修改为:

start:mov bl,0               
      mov ax,VARM1      
      add ax,0            
      js done               
GOON: INC bl               
      add ax,ax               
      cmp ax,0
      jns GOON ;添加这行来进行跳转
done:mov VARM,ax      
   mov VARB,bl


这样,只有当 ax 的最高位为 1(即ax为负数)时,它才会跳出循环,否则它会不断地返回 GOON,bl 的值会持续增加,代表着左移的次数。

倔强青铜铜 发表于 2023-5-20 20:16:08

isdkz 发表于 2023-5-20 20:13
INC bl 的确只是将 bl 的值增加1,但你需要注意到这一指令在一个循环中。循环开始于 start 标签,并在 GO ...

感谢!

陶远航 发表于 2023-5-20 21:18:38

倔强青铜铜 发表于 2023-5-20 20:08
首先感谢解答,还有不明白的是第5点说到INC bl的作用是bl的值+1,记录左移次数,看代码他只执行了一次, ...

首先,在这段代码中出现了一些错误和问题:

VARW1 这个变量在数据段中没有被定义,应该改为 VARM1。

add ax,0 这行代码没有实际意义,可以直接删去。

js done 这个条件跳转是错误的,应该使用 jns done,表示只有最高位不是 1 的时候才跳转到 done 标签,否则就继续执行下面的代码。

在 GOON 标签后的代码中,应该使用 jl done 条件跳转到 done 标签,因为当左移次数超过 16 次时(即最高位已经移动到了最低位),程序应该结束。

在保存左移结果和左移次数时,应该使用 mov word ptr VARM, ax 和 mov byte ptr VARB, bl,因为 VARM 是一个双字(4 字节)变量,而 ax 寄存器只有 2 字节;而 VARB 是一个字节变量,而 bl 寄存器只有 1 字节,需要使用 byte ptr 显式指定存储数据的大小。

修改后的代码如下:
data segment
    VARM1 dw '1'
    VARB db 12 dup(0)
    VARM dw 16 dup(0)
data ends

code segment
start:
    mov bl, 0
    mov ax, VARM1
check:
    jns done
goon:
    inc bl
    add ax, ax
    cmp bl, 16
    jl done
    jmp check
done:
    mov word ptr VARM, ax
    mov byte ptr VARB, bl
    ; 程序结束
code ends
end start

这个程序的主要逻辑是检查 VARM1 中二进制表示中最高位为 1 的位置,然后将其左移至最高位,并记录左移的次数和结果。具体来说,程序首先将 VARM1 的值赋给 ax 寄存器,然后不断将 ax 左移,并使用 bl 记录左移的次数,直到最高位(即符号位)为1。最后,程序将左移后的结果保存在 VARM 变量中,将左移次数保存在 VARB 变量中。


针对你的“还有不明白的是第5点说到INC bl的作用是bl的值+1,记录左移次数,看代码他只执行了一次,是不是代表bl的值最大就是1?”,我的回答是:不是的,INC bl 表示将 bl 中的值加 1,也就是说在 GOON 标签后,每执行一次 INC bl,就意味着左移次数加 1。程序会一直循环执行 GOON 标签后的代码,直到左移次数超过了 16 次(即最高位已经移动到了最低位),或者已经左移至最高位为 1。所以实际上 bl 的值可能会达到 16,并不止是 1。

有用请设置最佳答案
页: [1]
查看完整版本: 汇编语言的一段代码不理解,有很多不懂的地方