assembly - 为什么比较指令不起作用?
问题描述
所以我在 8086 中有一个简单的汇编代码,它将变量值中的值与 100 进行比较,如果它更大,则打印出:“值大于 100”,如果不是:“值不大于 100”。
这是代码:
data segment
string db "The value is larger$"
value db 80
right db "The value is greater than 100$"
wrong db "The value is not greater than 100$"
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
mov ax, data
mov ds, ax
mov es, ax
lea ax, value
cmp ax, 100d
jae StatementWrong
StatementRight:
lea dx, right
jmp Ending
StatementWrong:
lea dx, wrong
Ending:
mov ah, 9
int 21h
mov ah, 1
int 21h
mov ax, 4c00h
int 21h
ends
然而问题是无论我有什么值,无论它是否大于 100,StatementRight段总是被执行。
关于可能导致问题的任何想法?
解决方案
lea ax, value cmp ax, 100d jae StatementWrong
3条指令,3条全错!
该lea
指令加载值变量的地址。你需要它的内容。您可以通过以下任一说明获得此信息:
mov al, value
或者
mov al, [value]
由于您的值变量被定义为一个字节,您的代码也应该将其作为一个字节进行比较。
cmp al, 100
属于StatementWrong的消息显示:“值不大于 100”。当比较产生 ABOVE OR EQUAL 时,为什么要跳转到此消息?这是矛盾的。
jng StatementWrong
------------------------------------------
在上下文中(并有所改进!):
mov al, [value]
cmp al, 100
lea dx, right ; "The value is greater than 100$"
jg Ending ; JG means JUMP IF GREATER
lea dx, wrong ; "The value is not greater than 100$"
Ending:
mov ah, 09h
int 21h
推荐阅读
- nlp - 如何将 WAV 文件与里面的语音进行比较?
- angular - 如何正确地将 3 种类型的 http 请求按顺序和动态链接在一起?
- angularjs - 如何从Angular NGX Dropzone中的图像中提取base64
- javascript - 弃用警告:提供的值不在公认的 RFC2822 或 ISO 中
- code-coverage - 使用 lcov 合并两个或多个运行的分支覆盖
- julia - 如何在 Julia 1.6 中重新加载正在开发的模块?
- grafana - 如何在grafana指标中连接两个字符串
- r - 二十一点(使用 R)中的自然 21 的概率正在放弃“10 钻石”、“10 红心”、“10 黑桃”等的所有组合。为什么?
- sql - 存储过程生成 msg 512 子查询返回超过 1 个值
- docker - 为什么 pure-ftpd docker 存储库没有最近的标记版本