如何显示寄存器或变量的值 | 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.

中准备了一个很好的解释(带代码)