【问题标题】:Why my other label wont run ~02 Jump > 128~为什么我的其他标签无法运行~02 Jump > 128~
【发布时间】:2018-02-14 10:54:37
【问题描述】:

所以我有一个代码,其中有 2 个标签,按 1 表示加法,按 2 表示减法问题,只有一个标签会被读取,请帮助我解决这个问题。这是我的代码:

    JMP START
msg1    dw     10, 13, 10, 13, "Choose Operations:",0Dh,0Ah,0Dh,0Ah,09h
        dw      "1- Addition[+]",0Dh,0Ah,09h
        dw      "2- Subtraction[-]",0Dh,0Ah,09h      
        dw      "3- Exit",0Dh,0Ah,09h
        dw      "Enter: " 
        dw      '$'   
START:
    mov ax, 3
    int 10h

    mov ah, 2
    mov dh, 10
    mov dl, 10
    int 10h

    lea     dx, msg1  
    mov     ah, 09h 
    int     21h     

getnum:        
    mov     ah, 1 
    int     21h        

    cmp     al, '1' 
    jl      START  
    cmp     al, '3'
    jg      START 

    cmp     al, "1"
    je      Addition
    cmp     al, "2"
    je     Subtraction
    cmp     al, "3"
    jmp     Quit
    cmp     al, "4" 
Quit: 
    mov   ah,4ch
    int   21h
Subtraction:
VAR1 DW 5, 2 DUP(?)
VAR2 DW 5, 2 DUP(?)

PROMPT DW 'ENTER FIRST NUMBER:', '$'
PROMPT1 DW 'ENTER SECOND NUMBER :', '$'
PROMPT2 DW 'RESULT OF FIRST AND SECOND NUMBER IS: ', '$'

LEA DX,PROMPT
MOV AH,09H
INT 21H

;======================

 MOV  AH, 00             
 INT  16h

 MOV VAR1,AL   

 MOV  DL, AL             
 MOV  AH, 2H             
 INT  21H 

;======================

MOV DL,0AH
MOV AH,02H
INT 21H

MOV DL,0DH
MOV AH,02H
INT 21H

LEA DX,PROMPT1
MOV AH,09H
INT 21H

;=================================

MOV  AH, 00             
INT  16h

MOV VAR2,AL   

MOV  DL, AL             
MOV  AH, 2H             
INT  21H 

;======================

MOV DL,0AH
MOV AH,02H
INT 21H

MOV DL,0DH
MOV AH,02H
INT 21H

;===============================
SUB VAR1,30H
MOV BH,VAR1
SUB VAR2,30H
MOV BL,VAR2
SUB BH,BL


LEA DX,PROMPT2
MOV AH,09H
INT 21H
;==================================

ADD BH,30H
MOV VAR2,BH
MOV  DL, BH                     
MOV  AH, 2H             
INT  21H 

Addition:  **~02 Jump > 128~**

mov ax, 3
int 10h
NUM1 DB ?
NUM2 DB ?
RESULT DB ?
M1 DB 10,13,"ENTER FIRST NUMBER TO ADD : $"
M2 DB 10,13,"ENTER SECOND NUMBER TO ADD : $"
M3 DB 10,13,"SUM: $"
M4 DB 10,13,"DIFFERENCE: $"

    mov ax, 3
    int 10h

    lea dx, M1
    mov ah, 9
    int 21h

    mov ah, 1
    int 21h    
    sub al, 30h
    mov NUM1, al
    lea dx, M2
    mov ah, 9
    int 21h

    MOV AH,1
    INT 21H   
    sub al, 30h
    mov NUM2, al
    add al, NUM1
    mov RESULT, al

    mov ah, 0
    aaa
    add ah, 30h
    add al, 30h

    mov bx, ax
    lea dx, M3
    mov ah, 9
    int 21h

    mov ah, 2
    mov dl, bh
    int 21h

    mov ah, 2
    mov dl, bl
    int 21h

    mov ah, 4ch
    int 21h    
ret

【问题讨论】:

  • db定义字符串(你使用的是CP437,它是单字节编码)。还要保持一致的风格,使用'"。 (我喜欢 " 用于字符串,' 用于字符)。
  • 玛格丽特布鲁姆我真的需要一个代码来让标签运行:(
  • 恐怕你来错地方了:(
  • 这与128bit有什么关系?

标签: assembly dos x86-16 real-mode


【解决方案1】:

上的条件跳转只能向前跳转 127 个字节的距离。您程序中的标签 Addition 比这更远。

您可以通过重新安排测试来解决问题,这样您就可以使用可以跳更远距离的近距离跳跃。

因为对输入的验证

 cmp     al, "1"
 jb      START  
 cmp     al, "3"
 ja      START 

您需要处理的唯一字符是“1”、“2”和“3”。

先去掉“2”,再去掉“3”。剩下的将是“1”。

 cmp     al, "2"
 je      Subtraction
 cmp     al, "3"
 je      Quit
 jmp     Addition 
Quit: 
 mov     ah, 4Ch
 int     21h
Subtraction:
 ...
Addition:
 ...

您的代码存在严重问题,因为您将数据放置在需要指令的位置!

Subtraction:
VAR1 DW 5, 2 DUP(?)
VAR2 DW 5, 2 DUP(?)

PROMPT DW 'ENTER FIRST NUMBER:', '$'
PROMPT1 DW 'ENTER SECOND NUMBER :', '$'
PROMPT2 DW 'RESULT OF FIRST AND SECOND NUMBER IS: ', '$'

LEA DX,PROMPT
MOV AH,09H
INT 21H

您需要将数据置于说明下方(更下方):

Subtraction:
 LEA DX,PROMPT
 MOV AH,09H
 INT 21H

 ...

 VAR1 DW 5, 2 DUP(?)
 VAR2 DW 5, 2 DUP(?)
 PROMPT DW 'ENTER FIRST NUMBER:', '$'
 PROMPT1 DW 'ENTER SECOND NUMBER :', '$'
 PROMPT2 DW 'RESULT OF FIRST AND SECOND NUMBER IS: ', '$'

【讨论】:

  • 为什么数据与代码混合是一个严重的问题?
  • @Shift_Left:因为它会解码并作为指令执行。如果它在一个单独的部分中并以混合顺序简单地声明,那会很好,但它不在这里。
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2019-05-05
  • 2017-04-15
  • 1970-01-01
  • 2020-11-28
相关资源
最近更新 更多