如何显示寄存器或变量的值 | TASM
How to display the value of a register or variable | TASM
我有一个任务:统计数组中小于输入数字的元素个数。如何正确比较数组元素与此变量?结果是将元素的值与常量进行比较,而不是与输入的数字进行比较
我的代码:
.model small
.stack 100h
.data
array db 1, 2, 3, 4, 7, 5, 6
n db 3, ?, 3 dup(?)
counter dw 0
.code
StrToNumber PROC
mov bh, [si + 2]
mov bl, [si + 3]
sub bx, 3030h
mov al, 10
mul bh
add al, bl
ret
ENDP
start:
;started program exe
mov ax,@data
mov ds, ax
mov ah, 0Ah
lea dx, n
int 21h
lea si, n
call StrToNumber
mov cl, al
lea bx, array
beg:
mov ax, [bx]
cmp ax, 0
jge skip
push bx
lea bx, counter
mov ax, [bx]
inc ax
mov [bx], ax
pop bx
skip:
add bx, 4
loop beg
exit:
mov ax,4c00h
int 21h
end start
您的 StrToNumber 过程相当特殊,但如果您输入带有前缀 0 的单个数字值,它将产生正确的结果。例如值 4 的“04”。
这是错误的
loop beg
指令依赖于CX
寄存器。您只设置了 CL
寄存器。您还需要将 CH
归零。
数组定义为包含 bytes,但您的代码处理 words 并前进 dwords!将所有内容设为字节大小。
这太复杂了
代码:
push bx
lea bx, counter
mov ax, [bx]
inc ax
mov [bx], ax
pop bx
就是inc counter
这是一个解决方案
下面的代码将输入的数字留在AL
中,因此可以使用CX
来计算循环的迭代次数。
call StrToNumber ; -> AL is the inputted number e.g. 04
mov cx, 7 ; 7 elements in the array
lea bx, array
beg:
cmp [bx], al
jnl skip ; Skip if element is not less than inputted value
inc counter ; Count elements that are less than inputted value
skip:
inc bx ; BYTE sized elements
dec cx
jnz beg
如果你需要在屏幕上显示一些数字,我在这个 Q/A Displaying numbers with DOS.
中准备了一个很好的解释(带代码)
我有一个任务:统计数组中小于输入数字的元素个数。如何正确比较数组元素与此变量?结果是将元素的值与常量进行比较,而不是与输入的数字进行比较 我的代码:
.model small
.stack 100h
.data
array db 1, 2, 3, 4, 7, 5, 6
n db 3, ?, 3 dup(?)
counter dw 0
.code
StrToNumber PROC
mov bh, [si + 2]
mov bl, [si + 3]
sub bx, 3030h
mov al, 10
mul bh
add al, bl
ret
ENDP
start:
;started program exe
mov ax,@data
mov ds, ax
mov ah, 0Ah
lea dx, n
int 21h
lea si, n
call StrToNumber
mov cl, al
lea bx, array
beg:
mov ax, [bx]
cmp ax, 0
jge skip
push bx
lea bx, counter
mov ax, [bx]
inc ax
mov [bx], ax
pop bx
skip:
add bx, 4
loop beg
exit:
mov ax,4c00h
int 21h
end start
您的 StrToNumber 过程相当特殊,但如果您输入带有前缀 0 的单个数字值,它将产生正确的结果。例如值 4 的“04”。
这是错误的
loop beg
指令依赖于CX
寄存器。您只设置了 CL
寄存器。您还需要将 CH
归零。
数组定义为包含 bytes,但您的代码处理 words 并前进 dwords!将所有内容设为字节大小。
这太复杂了
代码:
push bx lea bx, counter mov ax, [bx] inc ax mov [bx], ax pop bx
就是inc counter
这是一个解决方案
下面的代码将输入的数字留在AL
中,因此可以使用CX
来计算循环的迭代次数。
call StrToNumber ; -> AL is the inputted number e.g. 04
mov cx, 7 ; 7 elements in the array
lea bx, array
beg:
cmp [bx], al
jnl skip ; Skip if element is not less than inputted value
inc counter ; Count elements that are less than inputted value
skip:
inc bx ; BYTE sized elements
dec cx
jnz beg
如果你需要在屏幕上显示一些数字,我在这个 Q/A Displaying numbers with DOS.
中准备了一个很好的解释(带代码)