diff --git a/py/asmarm.c b/py/asmarm.c
index 60286d55c8c7c865126af6b989f23826be0dcc29..51852df5f49d058458cfdaeed3830d0c97072395 100644
--- a/py/asmarm.c
+++ b/py/asmarm.c
@@ -282,8 +282,9 @@ void asm_arm_mov_reg_i32(asm_arm_t *as, uint rd, int imm) {
     // TODO: There are more variants of immediate values
     if ((imm & 0xFF) == imm) {
         emit_al(as, asm_arm_op_mov_imm(rd, imm));
-    } else if (imm < 0 && ((-imm) & 0xFF) == -imm) {
-        emit_al(as, asm_arm_op_mvn_imm(rd, -imm));
+    } else if (imm < 0 && imm >= -256) {
+        // mvn is "move not", not "move negative"
+        emit_al(as, asm_arm_op_mvn_imm(rd, ~imm));
     } else {
         //Insert immediate into code and jump over it
         emit_al(as, 0x59f0000 | (rd << 12)); // ldr rd, [pc]
diff --git a/tests/micropython/viper_binop_comp_imm.py b/tests/micropython/viper_binop_comp_imm.py
new file mode 100644
index 0000000000000000000000000000000000000000..c7c0408959514e5c52db79f6df7c4dffb6f9c2ea
--- /dev/null
+++ b/tests/micropython/viper_binop_comp_imm.py
@@ -0,0 +1,9 @@
+# comparisons with immediate boundary values
+@micropython.viper
+def f(a: int):
+    print(a == -1, a == -255, a == -256, a == -257)
+
+f(-1)
+f(-255)
+f(-256)
+f(-257)
diff --git a/tests/micropython/viper_binop_comp_imm.py.exp b/tests/micropython/viper_binop_comp_imm.py.exp
new file mode 100644
index 0000000000000000000000000000000000000000..3da9d09fbced97f874e5727a8255f415161c26a7
--- /dev/null
+++ b/tests/micropython/viper_binop_comp_imm.py.exp
@@ -0,0 +1,4 @@
+True False False False
+False True False False
+False False True False
+False False False True