|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- 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中
我想实现以上功能,但是我对汇编一窍不通,注释是一点点理解,想请问一下我该怎么根据错误来改正呀
这段汇编代码的作用是将变量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中。
|
|