期待指针类型

时间:2015-10-14 17:45:07

标签: assembly tasm

  

我认为错误是在循环或某处

.model small
    Org 100h
    .code
    Mov cx, 0ah
    Mov ah, 02h
    Mov dl, 39h
    Int 21h
    Mov bl, dl
    Mov dl, 0ah
    Int 21h
    Mov dl, 0dh
    Int 21h
    Mov dl, bl
    Dec dl
    Loop 0107
    Int 20h
    End

我这样做是对还是错?

1 个答案:

答案 0 :(得分:1)

Loop 0107显然应该只是一个偏移的绝对跳转,但是loop只能在-128 - +127个字节的距离内执行相对跳转。这个地方的这个指令的机器代码是E2 EE,意思是:"从这里跳回16个字节" (更确切地说:"从下一条指令跳回18个字节")。您可以对此进行编程:loop $-16$代表"此处",因此$-16是"此处减去16个字节" ="从这里返回16个字节"。您必须考虑此指令必须保持在完全相同的位置,并且不能之前插入代码,否则来自此处的" 16字节"不会瞄准正确的地方。

更好的是定义标签并跳转到那里。 TASM计算距离并生成正确的loop

; The order of `.MODEL - .CODE - ORG - start` is relevant!
.MODEL tiny                 ; .model small was wrong
.CODE
ORG 100h
start:                      ; Start label

    Mov cx, 0ah
    Mov ah, 02h
    Mov dl, 39h
my_107:                     ; Loop label
    Int 21h
    Mov bl, dl
    Mov dl, 0ah
    Int 21h
    Mov dl, 0dh
    Int 21h
    Mov dl, bl
    Dec dl
    Loop my_107             ; Loop to label `my_107`
    Int 20h

END start                   ; End of program with start label

请勿忘记TLINK.EXE的参数/t