【发布时间】:2017-11-18 23:39:16
【问题描述】:
所以我试图通过奇偶校验分隔一个八位字节,但我不太明白条件跳转是如何工作的(我单独尝试过,但我不明白它是如何工作的)
这是我想出的:
bits 32
global start
extern exit,printf
import exit msvcrt.dll
import printf msvcrt.dll
segment data use32 class=data
s db '1', '2', '3', '4','5','7','8','9' ; declararea sirului initial s
l equ $-s ; stabilirea lungimea sirului initial l
d1 times l db 0
d2 times 1 db 0
format db "%s", 0
segment code use32 class=code
start:
mov ecx, l
mov esi, 0
jecxz Sfarsit
Repeta:
;loop so it gets all the elements from s
mov al, [s+esi]
mov bl,al
sub bl,'0'
cmp bl,2; if is even adds it to d1
JP et2
mov [d1+esi], al
inc esi
et2:
mov bl,al
sub bl,'0'
cmp bl,2; if is odd adds it to d2
JP et1
mov [d2+esi], al
inc esi
et1:
loop Repeta
Sfarsit: ;terminarea programului
;Daca dorim si afisarea sirului d, avem urmatoarele:
push dword d1 ; punem parametrii pe stiva de la dreapta la stanga
push dword format
call [printf] ;apelam functia printf
add esp, 4 * 2 ; eliberam parametrii de pe stiva
; exit(0)
push dword d2 ; punem parametrii pe stiva de la dreapta la stanga
push dword format
call [printf] ;apelam functia printf
add esp, 4 * 2 ; eliberam parametrii de pe stiva
; exit(0)
push dword 0 ; push the parameter for exit onto the stack
call [exit] ; call exit to terminate the program
我认为问题出在JP,但我不完全确定。
【问题讨论】:
-
你能描述一下你的代码应该做什么以及它做什么而不是它应该做什么?
-
我加了一些cmets
-
奇偶校验不是关于一个数字是偶数还是奇数,你当然不会用
cmp bl, 2测试它。类似于test bl, 1; jz even的东西应该会更好。此外,您在et2处复制了代码,您不再需要测试。此外,执行落入et2你可能想跳到那里。 -
@Skillwalker cmets 没有解决我问你的问题。您希望该程序做什么以及它会做什么?