Code executes condition wrong?

拟墨画扇 提交于 2019-12-20 02:54:26

问题


Basic question here,

I wrote the following block:

    IDEAL
    MODEL small
    STACK 100h
    DATASEG

    Var1 db 4
    Var2 db 2

    CODESEG

start:
    mov ax, @data
    mov ds, ax
    xor ax, ax
    mov al, [Var1]
    cmp al, [Var2]
    jg  Var1Greater
    mov ax, 1
Var1Greater:
    mov ax, 0

I'm new to assembly.

I wanted to create a code that compares [Var1] to [Var2].

IF(!) [Var1] is greater than [Var2], execute mov ax, 1. IF(1) anything else(equal or less) excecute, mov ax, 0.

How can this be done? the code I wrote executes both instructions if the condition is true.


回答1:


Ah, Turbo Assembler "Ideal" mode; It has been a while since I last saw it. I love Ideal mode. It is so much better thought-out and it makes so much more sense than Microsoft Assembler's syntax.

Well, what is happening is that both instructions get executed.

First, mov ax, 0 gets executed, and then control falls through to the next statement, which is mov ax, 1, so what you are left with in ax is 1.

Labels in assembly language do not magically cause control to jump elsewhere. They do not cause the assembler to emit any instructions. They only exist so that you can indicate the target of another jump instruction.

So, what you need is:

    ...
    cmp al, [Var2]
    jg  Var1Greater
    mov ax, 0
    jmp skip
Var1Greater:
    mov ax, 1
skip:

also, it is good form when writing assembly language to use xor ax, ax instead of mov ax, 0.




回答2:


You must jump over Var1Greater too to skip mov ax, 1 instruction. As alternative you may do it like:

mov ax, [Var1]
cmp ax, [Var2]
mov ax, 1
jg  skip0
mov ax, 0
skip0:


来源:https://stackoverflow.com/questions/32872539/code-executes-condition-wrong

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!