我对装配很新。我试图弄清楚如何使用Emu8086读取汇编中的输入,并使其仍可用作值。
我有这段代码:
org 100h
jmp calc
message1 db 0dh, 0ah, "input height. $"
message2 db 0dh, 0ah, "input width. $"
width dw ' ', 20 dup('?')
height dw ' ', 20 dup('?')
w dw 0
h dw 0
calc:
mov dx, offset message1
mov ah, 9
int 21h
lea dx, width
mov ah, 0ah
int 21h
mov bx, dx
mov ah, 0
mov al, ds:[bx+1]
add bx, ax
mov w, ax
mov dx, offset message2
mov ah, 9
int 21h
lea dx, height
mov ah, 0ah
int 21h
mov bx, dx
mov ah, 0
mov al, ds:[bx+1]
add bx, ax
mov h, ax
; set video mode 13h - 320x200
code: mov ah, 0
mov al, 13h
int 10h
mov cx, w ; column
add cx, 100
mov dx, 20 ; row
mov al, 15 ; white
u1: mov ah, 0ch ; put pixel
int 10h
dec cx
cmp cx, 100
jae u1
; draw bottom line:
mov cx, w ; column
add cx, 100
mov dx, h ; row
add dx, 20
mov al, 15 ; white
u2: mov ah, 0ch ; put pixel
int 10h
dec cx
cmp cx, 100
ja u2
; draw left line:
mov cx, 100 ; column
mov dx, h ; row
add dx, 20
mov al, 15 ; white
u3: mov ah, 0ch ; put pixel
int 10h
dec dx
cmp dx, 20
ja u3
; draw right line:
mov cx, w ; column
add cx, 100
mov dx, h ; row
add dx, 20
mov al, 15 ; white
u4: mov ah, 0ch ; put pixel
int 10h
dec dx
cmp dx, 20
ja u4
; pause the screen for dos compatibility:
;wait for keypress
mov ah,00
int 16h
; return to text mode:
mov ah,00
mov al,03 ;text mode 3
int 10h
ret
但是,w和h似乎将值设置在程序的开头,而不是从宽度和高度中取值。
我需要做什么才能使w
和h
等于用户使用程序输入的整数值,所以我可以将它们添加到接近结尾的数字?< /强>
答案 0 :(得分:0)
w equ 0
未声明变量。它的作用是将符号w
等同于,以便代码中所有出现的w
都将替换为0.换句话说,它们是汇编 - 在运行时期间无法更改的时间常量。我很惊讶这甚至可以组装(如果确实如此),因为mov 0, ax
没有任何意义。
您应该做的是将它们声明为具有您想要的初始值的几个变量。例如:
; Declare h and w as words with an initial value of 0
h dw 0
w dw 0
请注意以下几行:
mov cx, 100+w
mov dx, 20+h
也必须改为:
mov cx,w
add cx,100
mov dx,h
add dx,20