2015-11-02 71 views
3

我的任务是比较ASM中的两个数字。我输入第一个数字(二进制​​)和第二个(二进制)。我必须比较Z1和Z2。如果Z1> = Z2,则显示TRUE,否则显示为FALSEASM比较2个数字

dane segment 
txt1 db 'First number: $' 
txt2 db 'Secend number: $' 
z1 dw 0 
z2 dw 0 
prawda db 'True!$' 
falsz db 'False!$' 
dane ends 

sts segment stack 
db 256 dup(?) 
sts ends 

program segment 
assume cs:program, ss:sts, ds:dane 
start: 
mov ax, seg dane 
mov ds,ax 

mov dx, offset txt1 
mov ah, 9 
int 21h 

mov cx, 16 
mov bx, offset z1 
petla1: 
mov ah, 1 
int 21h 
mov [bx], al 
inc bx 
loop petla1 

mov cx, 16 
mov ax, 0 
mov bx, offset z1 
petla2: 
shl ax, 1 
mov dl, [bx] 
cmp dl, 31h 
jne dal1 
add ax, 1 
dal1: 
inc bx 
loop petla2 

mov dx, offset txt2 
mov ah, 9 
int 21h 

mov cx, 16 
mov bx, offset z1 
petla3: 
mov ah, 1 
int 21h 
mov [bx], al 
inc bx 
loop petla3 

mov cx, 16 
mov ax, 0 
mov bx, offset z1 
petla4: 
shl ax, 1 
mov dl, [bx] 
cmp dl, 31h 
jne dal2 
add ax, 1 
dal2: 
inc bx 
loop petla4 

;JGE, >= JNL not < 
mov ax, [z1] 
mov bx, [z2] 
cmp ax,bx 
jge ety 
mov ah, 9 
mov dx, offset falsz 
int 21h 
jae koniec 

ety: 
mov ah,9 
mov dx, offset prawda 
int 21h 
koniec: 

mov ah, 4ch 
int 21h 
program ends 
end start 

我做错了什么?这是我的第一个汇编程序项目

回答

1
mov cx, 16 
mov bx, offset z1 
petla1: 
mov ah, 1 
int 21h 
mov [bx], al 
inc bx 
loop petla1 

您没有为此操作保留必要的内存! Z1被定义为一个字(2字节),并且您正在此循环中写入16个字节。
如果你想保持程序的基本结构,添加一个16字节缓冲区的定义来接收数字的二进制表示。

Buffer db 16 dup(0) 

mov cx, 16 
mov bx, offset Buffer 
petla1: 
mov ah, 1 
int 21h 
mov [bx], al 
inc bx 
loop petla1 

mov cx, 16 
mov ax, 0 
mov bx, offset Buffer 
petla2: 
shl ax, 1 
mov dl, [bx] 
cmp dl, 31h 
jne dal1 
add ax, 1 
dal1: 
inc bx 
loop petla2 

mov [z1], ax 

使用相同缓冲但存储AX在Z2就做类似的第二个数字。

请注意,jae koniec应该是无条件跳转。 jmp koniec