21,489
社区成员




哈,我明白了,老赵的代码是用AI写的吧~~~
老赵,引用你的名言:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
你这么爱调试的人居然不测试一下代码的正确性(代码输入错误都不算了),我居然这么信任你,默认你的代码是正确的~
我说老赵啊,你的代码都是错的~
第二题:
push ds
pop es
xor edx, edx
readbuf:
xor eax, eax
mov ecx, 4
lodsb
lea di, s
repne scasb
jnz parse_operand
xor cx, 3
xchg cx, prev_op
mov eax, b
call fun[ecx * 2]
mov b, eax
xor edx, edx
cmp prev_op, 0
je do_output
jmp readbuf
parse_operand:
cmp al, '0'
jb do_output ; illegal character
cmp al, '9'
ja do_output ; illegal character
sub al, 48
mov ecx, edx
shl ecx, 2
add edx, ecx
shl edx, 1
add edx, eax
jmp readbuf
fun_add:
add eax, edx
ret
fun_mul:
mul edx
ret
fun_div:
mov ecx, edx
jecxz do_output ; divided by 0
xor edx, edx
div ecx
ret
第一题:
push cs
pop es
lea bx, done
xor edx, edx
convert4b:
dec si
cmp si, offset s
jb done
mov al, [si]
lea di, lookup_table
mov cx, 22
repne scasb
jnz done
mov al, es:[di + 21]
sub byte ptr cs:[bx + 3], 4
shrd edx, eax, 4
jmp convert4b
lookup_table:
db '0123456789ABCDEFabcdef'
db 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,10,11,12,13,14,15
done: shr edx, 32
mov result, edx
老赵的代码写得太长(“代码不是老二越长越好”),字符串转数字,最简单的方法是查表加移位~
jmp begin
fun_add:
mov eax,[b]
add eax,ebx
mov [b],eax
ret
fun_mul:
mov eax,[b]
mul eax,ebx
mov [b],eax
ret
fun_div:
mov eax,[b]
xor edx,edx
div ebx
mov [b],eax
ret
fun_over:
cmp [prev_op],1
jne over1
call fun_add
ret
over1:
cmp [prev_op],2
jne over2
call fun_mul
ret
over2:
cmp [prev_op],3
jne over3
call fun_div
over3:
ret
begin:
xor eax,eax
mov [b],eax
xor ebx,ebx
mov [prev_op],1
dec si
nextchar:
int si
mov al,[si]
cmp al,0
je over
cmp al,'+'
jne next1
call fun_over
mov [b],ebx
xor ebx,ebx
mov [prev_op],1
jmp nextchar
next1:
cmp al,'*'
jne next2
call fun_over
mov [b],ebx
xor ebx,ebx
mov [prev_op],2
jmp nextchar
next2:
cmp al,'/'
jne next3
call fun_over
mov [b],ebx
xor ebx,ebx
mov [prev_op],3
jmp nextchar
next3:
cmp al,'9'
ja nextchar
cmp al,'0'
jb nextchar
sub al,'0'
xor ecx,ecx
mov cl,al
mov eax,ebx
mul eax,10
add eax,ecx
mov ebx,eax
jmp nextchar
over:
call fun_over
mov si,offset s
mov di,offset result
nextchar0:
mov al,[si]
cmp al,0
je over
cmp al,'0'
jb nextchar1
cmp al,'9'
jbe digit1
cmp al,'a'
jae lower1
cmp al,'F'
ja nextchar1
cmp al,'A'
jb nextchar1
sub al,'A'
add al,10
jmp save1
lower1:
cmp al,'f'
ja nextchar1
sub al,'a'
add al,10
jmp save1
digit1:
sub al,'0'
save1:
mov bl,al
nextchar1:
inc si
mov al,[si]
cmp al,0
je over
cmp al,'0'
jb nextchar2
cmp al,'9'
jbe digit2
cmp al,'a'
jae lower2
cmp al,'F'
ja nextchar2
cmp al,'A'
jb nextchar2
sub al,'A'
add al,10
jmp save2
lower2:
cmp al,'f'
ja nextchar2
sub al,'a'
add al,10
jmp save2
digit2:
sub al,'0'
save2:
mov bh,al
mov al,bl
shl al,4
or al,bh
mov [di],al
inc di
nextchar2:
inc si
jmp nextchar0
over: