我正在编写一个程序来打印0到100之间的所有数字,我需要找到变量(在本例中为变量counter
)的数字位数。
这是我的代码:
SECTION .data
len EQU 32
SECTION .bss
counter resd len
digit1 resd len
digit2 resd len
digit3 resd len
SECTION .text
GLOBAL _start
_start:
nop
Print:
mov eax, 4
mov ebx, 1
mov ecx, counter
mov edx, len
int 80h
Set:
mov BYTE [counter], 1
Divide:
; HERE IS WHERE I NEED TO FIND THE LENGTH OF THE VARIABLE COUNTER
; initial division
mov ax, [counter] ; number we want to print
mov ch, 10 ; we divide by ten to siphon digits
div ch ; divide our number by 10
; al now has 11, ah has 1
mov dh, ah ; save the remainder in dh
xor ah,ah
mov ch, 10 ; refill ch with the divisor
div ch ; al now has 1, ah now has 1
Move: ; now to move our digits to a printable state
mov [digit1], dh ; first digit is in edx
mov [digit2], ah
mov [digit3], al
Adjust:
add BYTE [digit1], '0'
add BYTE [digit2], '0'
add BYTE [digit3], '0'
Print:
mov eax, 4
mov ebx, 1
mov ecx, digit1
mov edx, len
int 80h
mov eax, 4
mov ebx, 1
mov ecx, digit2
mov edx, len
int 80h
mov eax, 4
mov ebx, 1
mov ecx, digit3
mov edx, len
int 80h
Exit:
mov eax, 1
mov ebx, 0
int 80h
我需要找到长度,以便知道要分割多少次以及打印变量计数器的位数。
我怎样才能找到它有多长?
提前致谢
答案 0 :(得分:1)
对于0..100
范围内的数字,我只是在边界处进行比较,使用伪汇编程序:
mov ax, [counter]
mov cx, 3 ; default length
cmp ax, 100 ; >= 100, use 3
bge done
dec cx ; set length to 2
cmp val, 10 ; >= 10, use 2
bge done
dec cx ; set length to 1
done:
; cx now holds the digit count.
实际上最多可以处理999,但如果你想扩大范围,你也可以在100之前添加更多的条件检查。
答案 1 :(得分:1)
答案 2 :(得分:0)
通常这是通过内部缓冲区完成的(实际上堆栈将执行:)
你除Y = X mod 10(或Y = X mod base),X = X div base,直到X = 0(并推动每个mod Y) 计算分区数,然后从堆栈C中弹出每个结果C次 并写入输出流。
void print_number(int eax, int ebx) { // ebx = base, eax = number
int ecx = 0;
do {
edx = eax % ebx;
eax = eax / ebx;
push(edx);
ecx++;
} while (eax);
while (ecx) {
pop (eax);
putch(eax+'0');
ecx--;
}
}
关键是你最终需要完全分开。
稍微优化一点的是[再次在C中鼓励你自己的想法] ......
void print_number(int a, int base) {
char string[10];
static *ptr = string+9; // points to the last char of string
*ptr--=0; // write ending ASCII Zero.
*ptr='0';
while (a) {
*--ptr= '0'+(a % base); // works for base = 2-10
a/=base;
}
printf("%s",ptr);
}
你能找出这个有效(或没有)的原因吗?