一个汇编小程序,望大虾指点

toann 2004-11-02 11:28:56
题目:定义数据段DATA_SEG,他把整数5赋给第一个字节,并把整数-1,0,2,5,4放在10字数组
DATA_LIST头5个字单元中。写出完整的代码段,其功能为:把DATA_LIST中头5个数中的最
大值和最小值分别存入MAX和MIN单元中。

我的思路是:把DATA_LIST的第一个数,也就是-1分别送给MAX和MIN,然后从第二个数据开始循环比较
如果MAX < DATA_LIST[SI]就把DATA_LIST[SI] -> MAX;如果MIN > DATA_LIST[SI]就把
DATA_LIST[SI] -> MIN,这样循环结束后,MAX中就为最大值,MIN中就为最
小值。不知是否可行?
问题:1、如何在屏幕输出MAX和MIN
2、现在的程序没有屏幕输出,怎样查看MAX和MIN的值?

我的程序如下,我现在不知道结果是否正确,希望大虾能帮忙看看:

;*****************DataSegment****************
DATA_SEG SEGMENT
First DB 5
DATA_LIST DW -1, 0, 2, 5, 4, 5 DUP(?) ; use 5 DUP(?) because 10 word array
MAX DW ?
MIN DW ?
DATA_SEG ENDS

;*****************CodeSegment****************
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE, DS:DATA_SEG
START:
MOV AX, DATA_SEG ; initialization DS segment
MOV DS, AX
MOV SI, 0 ; initialization array pointer
MOV CX, 5 ; initialization count
MOV AX, DATA_LIST[SI] ; First number of array -> MAX
MOV MAX, AX
MOV AX, DATA_LIST[SI] ; First number of array -> MIN
MOV MIN, AX
COMPARE: INC SI ; or ADD SI, 2
INC SI
MOV AX, DATA_LIST[SI]
CMP MAX, AX
JL LESS ; if MAX < DATA_LIST[SI] then DATA_LIST[SI] -> MAX
L: CMP MIN, AX
JG BIG ; if MIN > DATA_LIST[SI] then DATA_LIST[SI] -> MIN
B: LOOP COMPARE
JMP OVER
LESS: MOV MAX, AX
JMP L
BIG: MOV MIN, AX
JMP B
OVER: MOV AX, 4C00H ; Return DOS
INT 21H
CODE ENDS
END START
...全文
108 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
toann 2004-11-04
  • 打赏
  • 举报
回复
呵呵,我知道了。
谢谢大虾。我马上结帖
大熊猫侯佩 2004-11-04
  • 打赏
  • 举报
回复
这样简单的加 30h 在一位数中是可以的,但多位就不行了。
要打印出 -1 你要事先判断是否是负数,如果是的话先打
- 号,然后再打 数字。
大熊猫侯佩 2004-11-03
  • 打赏
  • 举报
回复
Yes!楼主的方法是可以的,而且代码逻辑也正确
但有一些小问题,比如没有写 MAIN ENDP 等等

;*****************DataSegment****************
DATA_SEG SEGMENT
First DB 5
DATA_LIST DW -1, 0, 2, 5, 4, 5 DUP(?)
MAX DW ?
MIN DW ?
DATA_SEG ENDS

;*****************CodeSegment****************
CODE SEGMENT

ASSUME CS:CODE, DS:DATA_SEG
START:
MAIN PROC FAR
MOV AX, DATA_SEG
MOV DS, AX
MOV SI, 0
MOV CX, 5
MOV AX, DATA_LIST[SI]
MOV MAX, AX
MOV AX, DATA_LIST[SI]
MOV MIN, AX
COMPARE: INC SI ; or ADD SI, 2
INC SI
MOV AX, DATA_LIST[SI]
CMP MAX, AX
JL LESS
L: CMP MIN, AX
JG BIG
B: LOOP COMPARE
JMP OVER
LESS: MOV MAX, AX
JMP L
BIG: MOV MIN, AX
JMP B
OVER: MOV AX, 4C00H
INT 21H
MAIN ENDP
CODE ENDS
END START

1、如何在屏幕输出MAX和MIN
可以调用 dos 21h 的 2h 服务来屏幕显示
但要事先作转换。

2、现在的程序没有屏幕输出,怎样查看MAX和MIN的值?
可以用 Debug 来看。
具体为:
先用源代码生成 .exe 文件,比如是 rr.exe
D:\MASM611\MyAsm>debug rr.exe
-l
-d100
13BC:0100 05 FF FF 00 00 02 00 05-00 04 00 00 00 00 00 00 ................
13BC:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13BC:0120 B8 CC 13 8E D8 BE 00 00-B9 05 00 8B 84 01 00 A3 ................
13BC:0130 15 00 8B 84 01 00 A3 17-00 46 46 8B 84 01 00 39 .........FF....9
13BC:0140 06 15 00 7C 0A 39 06 17-00 7F 09 E2 EC EB 0A A3 ...|.9..........
13BC:0150 15 00 EB F1 A3 17 00 EB-F2 B8 00 4C CD 21 F7 EB ...........L.!..
13BC:0160 58 80 3E 96 63 00 74 05-E8 F3 FD EB 08 A1 34 37 X.>.c.t.......47
13BC:0170 48 50 E8 8D 29 C6 06 D3-2B FF EB 3D E8 93 F3 EB HP..)...+..=....
-g <--------执行

Program terminated normally
-d100
13BC:0100 05 FF FF 00 00 02 00 05-00 04 00 00 00 00 00 00 ................
13BC:0110 00 00 00 00 00 05 00 FF-FF 00 00 00 00 00 00 00 ................
13BC:0120 B8 CC 13 8E D8 BE 00 00-B9 05 00 8B 84 01 00 A3 ................
13BC:0130 15 00 8B 84 01 00 A3 17-00 46 46 8B 84 01 00 39 .........FF....9
13BC:0140 06 15 00 7C 0A 39 06 17-00 7F 09 E2 EC EB 0A A3 ...|.9..........
13BC:0150 15 00 EB F1 A3 17 00 EB-F2 B8 00 4C CD 21 F7 EB ...........L.!..
13BC:0160 58 80 3E 96 63 00 74 05-E8 F3 FD EB 08 A1 34 37 X.>.c.t.......47
13BC:0170 48 50 E8 8D 29 C6 06 D3-2B FF EB 3D E8 93 F3 EB HP..)...+..=....


比较一下先后 d100 输出的二进制块,在 13bc:0110 一行发现不同了吧,呵呵。
toann 2004-11-03
  • 打赏
  • 举报
回复
MOV DX, MAX ; print MAX
ADD DL, 30H
MOV AH, 02
INT 21H
我用以上指令打印出了最大值5;
我想请问,我怎样才能打印出回车,以及最小值-1?还没有学到中断调用,以上是参考别的程序,望大虾指点:)
toann 2004-11-03
  • 打赏
  • 举报
回复
非常感谢!

呵呵,我要搜索什么内容的帖子啊?
大熊猫侯佩 2004-11-03
  • 打赏
  • 举报
回复
另外我想请问一下:您说“调用 dos 21h 的 2h 服务来屏幕显示但要事先作转换。”能不能就这个程序详细说一下如何打印和转换?

这个你可以搜一下以前的贴子,我写过一个。

另外,怕怕的问一下:您为什么输入-d100而不是其他?这条命令是什么意思:)
因为默认 l 指令将程序调入到偏移量100的位置上,d 是用来显示指定偏移量的内容的,所以d100
从调入程序头开始显示二进制代码。

在 13bc:0110 一行的FF-FF是不是就是MIN中的-1?MAX中的内容呢?怎样才能知道MAX和MIN在哪?
这个很简单,看一下前面在 DATA_SEG 中定义的变量,可以知道 MAX 和 MIN 变量在程序头开始
的 21 和 23 偏移处(1 + 2 * 20 -1=20)。ffff 就是 -1 max 是 5:

13BC:0100 05 FF FF 00 00 02 00 05-00 04 00 00 00 00 00 00 ................
13BC:0110 00 00 00 00 00 05 00 FF-FF 00 00 00 00 00 00 00 ................
toann 2004-11-03
  • 打赏
  • 举报
回复
呵呵,多谢大虾!!!太感谢了!!

另外我想请问一下:您说“调用 dos 21h 的 2h 服务来屏幕显示但要事先作转换。”能不能就这个程序详细说一下如何打印和转换?

另外,怕怕的问一下:您为什么输入-d100而不是其他?这条命令是什么意思:)在 13bc:0110 一行的FF-FF是不是就是MIN中的-1?MAX中的内容呢?怎样才能知道MAX和MIN在哪?

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧